2017-07-29 14 views
15

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?

+3

'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

+0

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

Odpowiedz

20

Są różne, ale to nie ma znaczenia, ponieważ argument const int& można przekazać do parametru int i to wszystko, co jest wymagane.

16

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ów ArgTypes i typu zwrotu R. [...]

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.

Powiązane problemy