2014-09-30 64 views
9

當使用decltype圍繞一個命名空間,我可以編寫代碼編譯,但聲明似乎並未有下的g ++ 4.9.1任何影響,下鐺它產生error: unexpected namespace name 'std': expected expressiondecltype(std)合法嗎?它有任何用途嗎?

例如,下面的所有在g ++下編譯,但程序集不顯示爲它們生成的任何代碼。

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

如果g ++是正確的嗎?如果是這樣,代碼消失的優勢是什麼,而不是導致編譯時錯誤?

+9

看起來像g ++中的bug。 – Borgleader 2014-09-30 15:29:33

回答

13

不,這不合法。由語法允許兩個decltype說明符形式是(N3690,§7.1.6.2/ 1):

decltype說明符:
decltype表達
decltype (auto)

並且命名空間名稱不是表達式。

我引用的段落來自標準草稿帖子C++ 11,因此decltype(auto)不適用於C++ 11。但答案是一樣的。

相關問題