2015-02-16 16 views
18

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)) 
+0

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ę." –

+0

@remyabel tak, widziałem to, po prostu nie wiem, jak "zbudować" mój własny 'declval' – vsoftco

+0

' 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) –

Odpowiedz

12

Zasadniczo w sizeof lub decltype wypowiedzi można funkcje, które nie są realizowane w dowolnym miejscu (muszą one zostać uznane za rozmowę, nie wdrożone).

E.g.

class Silly { private: Silly(Silly const&) = delete; }; 

auto foo() -> Silly&&; 

auto main() -> int 
{ 
    sizeof(foo()); 
} 

Łącznik nie powinien narzekać na to.

+0

Ahh, ok, teraz ma sens, dlaczego "dodawanie wartości odniesienia rvalue" robi lewę. Z jakiegoś powodu nie wiedziałem, że możesz użyć "decltype" na właśnie zadeklarowanych funkcjach. Jedyne, co mnie nadal zaintrygowało, to dlaczego możesz wywołać '.f()' w 'declval () .f()', pomyślałbym, że potrzebujesz czegoś takiego jak 'declval () :: f () '' – vsoftco

+2

@vsoft w nieocenionym kontekście, wszystko, co ma znaczenie, to typy. Nie potrzebujesz instancji, aby użyć instancji: po prostu musisz udawać. Czym w końcu jest dźwięk jednej ręki spadającej do lasu, jeśli istnieją dwa trolly? – Yakk

Powiązane problemy