【发布时间】:2016-10-17 13:55:29
【问题描述】:
对于以下代码:
class Foo{
int foo;
public:
Foo() : foo(13) {}
int getFoo() const { return foo; }
};
union Bar{
Foo fBar;
double dBar;
};
我相信这在 C++ 中是完全合法的。 http://en.cppreference.com/w/cpp/language/union#Explanation 说:
如果两个联合成员是标准布局类型,则在任何编译器上检查它们的公共子序列是明确定义的
Bar bar = { Foo() }
当我在 Visual Studio 2008 中尝试这个时,我得到了错误:
错误 C2620:
union Bar的成员Bar::fBar具有用户定义的构造函数或重要的默认构造函数
Error C2620 状态:
联合成员不能有默认构造函数。
这里发生了什么?这曾经是 C++ 的要求吗,我认为标准布局是唯一的要求?有解决办法吗?
【问题讨论】:
-
VS2008 不包含 C++11 编译器。如果要使用 C++11 中引入的语言功能,则需要升级
-
如果您想要获得最高的 C++11 一致性,我会选择 2015 更新 3。
-
@CaptainObvlious 这不是 C++11 的功能,并且错误仍然列在 Visual Studio 2013 中:msdn.microsoft.com/en-us/library/43ae0055(v=vs.120).aspx
-
@NathanOliver 这不是 C++11 的功能,并且错误仍然列在 Visual Studio 2013 中:msdn.microsoft.com/en-us/library/43ae0055(v=vs.120).aspx
-
@JonathanMee Unions 确实从 C++98/03 更改为 C++11。在他们必须只有 POD 对象之前。现在它们被扩展了。另请注意,MSVS2013 仍然缺少 C++11 功能。请参阅this,其中有 Unrestricted union
标签: c++ visual-studio-2008 unions default-constructor standard-layout