2014-09-30 5 views
9

Quando si utilizza decltype attorno uno spazio dei nomi, posso scrivere codice che compila, ma la dichiarazione non sembra avere alcun effetto sotto g ++ 4.9.1, sotto clang produce error: unexpected namespace name 'std': expected expressionDecltype (std) è legale e ha qualche scopo?

Ad esempio, il seguente tutto compilare sotto g ++, ma l'assembly non mostra alcun codice generato per loro.

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))); 

Se g ++ ha ragione nel consentire questo? In tal caso, qual è il vantaggio della scomparsa del codice anziché causare un errore in fase di compilazione?

+9

Sembra un bug in g ++. – Borgleader

risposta

13

No, non è legale. I due decltype-specificatore forme che sono consentiti dalla grammatica sono (N3690, §7.1.6.2/1):

decltype-specificatore:
decltype (espressione)
decltype (auto)

e un nome di spazio dei nomi non è un'espressione.

Il paragrafo che ho citato proviene da una bozza standard di post C++ 11, quindi decltype(auto) non si applica a C++ 11. La risposta è la stessa, però.