Dlaczego ten kod się kompiluje?Czy const i & ignored w std :: function?
std::function<void(const int&)> f = [](int a)
{
};
nie są int
i const int&
różne rodzaje?
Dlaczego ten kod się kompiluje?Czy const i & ignored w std :: function?
std::function<void(const int&)> f = [](int a)
{
};
nie są int
i const int&
różne rodzaje?
Są różne, ale to nie ma znaczenia, ponieważ argument const int&
można przekazać do parametru int
i to wszystko, co jest wymagane.
Powodem kodu do pracy jest to, że na matrycy konstruktor std::function<R(Args...)>
biorąc dowolną funkcją obiektu F
wymaga F
się wymagalne z Args...
powrocie R
.
template<class R, class... ArgTypes> class function<R(ArgTypes...)> { template<class F> function(F f); };
Wymaga:
F
będzie CopyConstructible. f będzie Możliwość wywoływania dla typów argumentówArgTypes
i typu zwrotuR
. [...]
Obiekt funkcja biorąc int
jest wymagalne użyciu const int&
a więc ten kod jest poprawny i spełnia wymagania zarówno od powrotu void
.
'f' może z łatwością przekazać referencję const do lambda, więc jest poprawna. Spróbuj zdefiniować funkcję, która akceptuje referencję do const i przekazuje ją do funkcji, która akceptuje 'int' jak twoja lambda. Działa, prawda? Dlaczego więc nie powinno to działać w tym przypadku? – skypjack
Dżentelmen z dość przystojną brodą o imieniu Arthur O'Dwyer wygłosił wykład na CppCon 2016 na temat szablonów i odliczeń typu szablonu, które są dostępne na youtube https://www.youtube.com/watch?v=vwrXHznaYLA – systemcpro