c – decltype(std)是否合法,是否有目的?

当在命名空间周围使用decltype时,我可以编写编译代码,但是该语句在g 4.9.1下似乎没有任何效果,它会产生错误:意外命名空间名称’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是正确的允许这个?如果是这样,代码消失的优点是什么,而不是导致编译时错误

解决方法

不,这不合法.语法允许的两个decltype-specifier表单是(N3690,§7.1.6.2/ 1):

decltype-specifier:
decltype ( expression )
decltype ( auto )

并且命名空间名称不是表达式.

我引用的段落来自C 11标准草案,所以decltype(auto)不适用于C 11.答案是一样的.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...