[英]VS2012 doesn't compile this code, but G++, clang, and ICC all accept it without a diagnostic
基于这个答案 ,我想出了以下代码,用于C ++中的恒定树结构:
#include <tuple>
struct T
{
T(const char* n, const T& n1, const T& n2, const T& n3, const T& n4):
name(n), nodes(n1, n2, n3, n4) {}
const char* name;
std::tuple<const T&, const T&, const T&, const T&> nodes;
};
T n(0, n, n, n, n);
GCC(4.5.3和最新版本),ICC(17)和CLang(3.5和最新版本)都编译此代码(CLang 3.5 -Wuninitialized
发出-Wuninitialized
警告,但是没关系,因为n
是占位符,其值为无关)。
但是,MSVC 11(VS2012)在n
的定义上出现了C2065错误:
test6.cpp(12):错误C2065:'n':未声明的标识符
是什么赋予了? MSVC是否拒绝有效的代码? 我是不是在UB土地上,恶魔从我的鼻子里飞了出来? 如果无效,有人可以告诉我标准中的哪些内容使它无效和/或为什么GCC,Clang和ICC都接受它?
简化为一个简单的
unsigned char x(x);
并在http://webcompiler.cloudapp.net/在线进行了测试,结果表明当前版本的Microsoft编译器仍然拒绝它。
这是一个编译器错误。 引用标准(N4140,大致为C ++ 14,但规则与早期标准相同):
3.3.2声明点[basic.scope.pdecl]
1名称的声明点紧随其完整的声明符(第8节)之后及其初始化程序 (如果有)之前,除非另有说明。 [ 示例:
unsigned char x = 12; { unsigned char x = x; }
在此,第二个
x
用其自己的(不确定的)值初始化。 - 结束示例 ]
两者= x;
和(x);
在语法上是一个初始化器 ,并且在(x);
没有任何表示异常的地方(x);
从语法上讲,变量x
可能不在范围内。
Visual Studio的编译器确实使用= x;
接受它= x;
句法。
但是由于它只影响在其自身的初始化中使用了变量的代码,因此更好地重做代码可以完全避免问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.