2014-09-30 50 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。但答案是一样的。

相关问题