繁体   English   中英

VS2012不会编译此代码,但是G ++,clang和ICC都接受了此代码而没有诊断

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM