c++ - decltype(std) 是否合法,是否有任何用途?

标签 c++ c++11 g++ decltype

当在命名空间周围使用 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/

相关文章:

c++ - 声明 C++ 不可变类的惯用方式

c++ - C++11 是否支持模板中的类型递归?

c++ - 编译器优化

c++ - 在 g++ 中使用 std::variant

c++ - 有选择地禁用库中的死代码消除

c++ - 如何使用 GRUB 查询 BIOS?

c++ - 我不明白VS2013编译器显示的错误

c++ - 在 C++98、C++11 交叉编译代码中处理重写的优雅方法?

c++ - 如何将 lambda 函数传递给具有模板类的类的实例化

c++ - 在编译时获取变量名的标准方法