Compiler: TDM-gcc-5.1.0 (SJLJ odwijania)Nie można użyć declval w typeid dla TDM-GCC
Grałem około z declval
i zauważyłem, że nie udało mi się go używać w sytuacji, gdy powinien działać: jako argument do typeid()
.
W poniższym kodzie używam declval
dla jednego z podstawowych przypadków użycia: w celu uzyskania typu zwrotu metody bez przechodzenia przez instancję. Błąd pojawia się komunikat static_assert z declval
, ale to powinno być niemożliwe, ponieważ typeid()
nie ocenia to argumentem w tym przypadku:
#include <typeinfo>
#include <utility>
struct Foo
{
int func();
};
int main()
{
typeid(std::declval<Foo>().func());
}
nie skompilować dla mnie (gdy skompilowany z -std=c++14
). Moim jedynym przypuszczeniem jest, że albo znalazłem błąd kompilatora, albo zrobiłem coś oczywiście nie tak i nie widzę tego. Jeśli to drugie, moje przeprosiny.
EDIT: Dzięki Ildjarn za pomoc mnie, rozwiązaniem jest użycie decltype
, więc ostatni wiersz kodu staje:
typeid(decltype(std::declval<Foo>().func()));
i to działa dobrze. Jednak teraz moje pytanie brzmi: jak to się stało? Zarówno typeid()
, jak i decltype()
są niejednoznacznymi kontekstami, więc nie jestem pewien, na czym polega różnica.
Wypróbuj 'typid (decltype (std :: declval() .func()));' –
ildjarn
Ah, to działa! Zastanawiam się, dlaczego tak jest ... –
Od [cppreference] (http://en.cppreference.com/w/cpp/language/typeid): "Jeśli' expression' nie jest wyrażeniem glvalue typu polimorficznego, 'typeid' nie ocenia wyrażenia [.] ". Myślę o błędzie kompilatora. – Quentin