2014-09-30 11 views
9

Podczas korzystania decltype wokół nazw, można napisać kod, który kompiluje, ale stwierdzenie wydaje się nie mieć żadnego wpływu pod g ++ 4.9.1, pod brzękiem produkuje error: unexpected namespace name 'std': expected expressionCzy decltype (std) jest legalne i czy ma jakiś cel?

Na przykład, następujący wszystko skompiluj pod g ++, ale zestaw nie pokazuje żadnego wygenerowanego dla nich kodu.

using s = decltype(std); 
auto n = typeid(decltype(std)).name(); 
auto sz = n.size(); 
std::printf("size is %zu\n", sz+1); 
std::printf("this type is: %s\n\n", n.c_str()); 

// the only limit is your imagination 
int f(); 
std::ostream trash = f(typeid(decltype(std)) * 10 - 6^typeid(decltype(std))); 

Jeśli g ++ ma rację, dopuszczając to? Jeśli tak, to jaka jest zaleta tego, że kod znika, zamiast powodować błąd podczas kompilacji?

+9

Wydaje się, że jest to błąd w g ++. – Borgleader

Odpowiedz

13

Nie, to nie jest legalne. Te dwa decltype-specyfikator formy, które są dopuszczone przez gramatykę (N3690, §7.1.6.2/1)

decltype-specyfikator:
decltype (ekspresji)
decltype (auto)

a nazwa przestrzeni nazw nie jest wyrażeniem.

Cytowany przeze mnie akapit pochodzi ze standardowej wersji roboczej C++ 11, więc decltype(auto) nie ma zastosowania w C++ 11. Odpowiedź jest jednak taka sama.

Powiązane problemy