每当我尝试编译代码:
时union foo {
std::string dunno;
} bar;
它给了我一堆错误。它有什么问题?:
_foo.cpp:6:3: error: use of deleted function 'foo::foo()'
} bar;
^
_foo.cpp:4:7: note: 'foo::foo()' is implicitly deleted because the default definition would be ill-formed:
union foo {
^
_foo.cpp:5:14: error: union member 'foo::dunno' with non-trivial 'std::basic_string<_CharT, _Traits, _Alloc>::basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'
std::string dunno;
^
_foo.cpp: In function 'void __static_initialization_and_destruction_0(int, int)':
_foo.cpp:6:3: error: use of deleted function 'foo::~foo()'
} bar;
^
_foo.cpp:4:7: note: 'foo::~foo()' is implicitly deleted because the default definition would be ill-formed:
union foo {
^
_foo.cpp:5:14: error: union member 'foo::dunno' with non-trivial 'std::basic_string<_CharT, _Traits, _Alloc>::~basic_string() [with _CharT = char; _Traits = std::char_traits<char>; _Alloc = std::allocator<char>]'
std::string dunno;
^
_foo.cpp: In function 'void __tcf_1()':
_foo.cpp:6:3: error: use of deleted function 'foo::~foo()'
} bar;
^
你能解释一下,为什么?
答案 0 :(得分:9)
C ++ 11确实引入了在联合中包含任意类型的可能性。但是,您需要为union提供这些类型具有的所有特殊成员函数。它在C ++ 11 9.5 / 2中得到了很好的总结:
[注意:如果联合的任何非静态数据成员具有非平凡的默认值 构造函数(12.1),复制构造函数(12.8),移动构造函数(12.8),复制赋值运算符(12.8),移动 赋值运算符(12.8)或析构函数(12.4),联合的相应成员函数必须是 用户提供或将隐式删除(8.4.3)联盟。 -end note ]
这意味着如果你希望你的联盟有一个默认的构造函数,你必须定义它,如下所示:
union foo {
std::string dunno;
foo() : dunno() {}
} bar;
答案 1 :(得分:0)
C ++ 03标准禁止在std::string
中使用具有非平凡构造函数(union
构造函数非常重要)的类型。此限制已在C ++ 11中删除。
如果union具有非平凡构造函数的成员,则还需要定义构造函数。