decltype(std)合法吗?它有什么作用?

9

当在命名空间周围使用 decltype 时,在 g++4.9.1 下可以编写可编译的代码,但该语句似乎没有任何效果,在 clang 下它会产生以下错误:error: unexpected namespace name 'std': expected expression

例如,以下所有内容都在 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++中的一个错误。 - Borgleader
1个回答

13
不,这是不合法的。语法允许的两种decltype-specifier形式为(N3690, §7.1.6.2/1):
- decltype-specifier: - decltype(expression) - decltype(auto)
而命名空间名称不是表达式。
我引用的段落来自C++11后的标准草案,因此decltype(auto)不适用于C++11。不过答案是相同的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接