当在命名空间周围使用 decltype
时,我可以编写编译代码,但该语句在 g++4.9.1 下似乎没有任何效果,在 clang 下它生成 错误:意外的命名空间名称“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++ 允许这样做是正确的吗?如果是这样,代码消失而不是导致编译时错误的优势是什么?
最佳答案
不,这是不合法的。语法允许的两种 decltype-specifier 形式是(N3690,§7.1.6.2/1):
decltype-specifier:
decltype
( expression )
decltype ( auto )
并且命名空间名称不是表达式。
我引用的段落来自 C++11 后的标准草案,因此 decltype(auto)
不适用于 C++11。不过答案是一样的。
关于c++ - decltype(std) 是否合法,是否有任何用途?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26124547/