【发布时间】:2017-02-08 17:23:10
【问题描述】:
基于this answer,我想出了this code 用于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 警告,但这没关系,因为 n是一个占位符,其值无关紧要)。
然而,MSVC 11 (VS2012) 对 n 的定义产生了 C2065 错误:
test6.cpp(12) : 错误 C2065: 'n' : 未声明的标识符
什么给了? MSVC 是否拒绝有效代码?我是不是在 UB 的土地上,恶魔从我的鼻子里飞出来?如果这无效,有人可以告诉我标准中的什么使它无效和/或为什么 GCC、Clang 和 ICC 都接受它?
【问题讨论】:
-
即使这是有效的 C++,这也不是一个好主意...
-
std::tuple在 c++11 标准中可用。 VS2012 不支持。 -
@SamVarshavchik -- 如果不依赖于我们的占位符
n的值,为什么让它未初始化会不好?还是您要指出其他问题? (我宁愿做一些更好的事情,但我的工具包中没有太多 C++11 意味着我很受限制......) -
这个测试用例可以缩短为
int i(i);。这是 VC++ 不接受的部分。您的struct T和您的元组与此问题无关。 -
@πάνταῥεῖ -- ...什么新语法?