Próbuję zrozumieć, jak działa std::declval<T>()
. Wiem, jak go używać, i wie, co robi, głównie pozwala na użycie decltype
bez budowy obiektu, jakJak działa std :: declval <T>()?
decltype(std::declval<Foo>().some_func()) my_type; // no construction of Foo
wiem z cppreference.com że std::declval<Foo>
„dodaje” odniesienie rvalue do Foo
, które ze względu na Referencyjne reguły zwijania kończą się albo referencją rvalue, albo referencją lvalue. Moje pytanie brzmi, dlaczego konstruktora Foo
nie nazywa? W jaki sposób można wdrożyć "zabawkową" wersję std::declval<T>
bez konstruowania parametru szablonu?
PS: I know to nie jest taki sam jak stary trik
(*(T*)(nullptr))
Z tej samej strony: "Zauważ, że ponieważ nie istnieje definicja deklwalacji, może być używana tylko w nienazwanych kontekstach, jest to błąd w ocenie wyrażenia zawierającego tę funkcję." –
@remyabel tak, widziałem to, po prostu nie wiem, jak "zbudować" mój własny 'declval' – vsoftco
' szablon < class T > nazwa-pliku std :: add_rvalue_reference :: type declval(); 'jest dosłownie wszystko czego potrzebujesz. [Przykład na żywo] (http://coliru.stacked-crooked.com/a/9a8d4e5cfa60355f) –