【发布时间】:2014-01-24 19:23:49
【问题描述】:
在更新一些代码以使用统一初始化时,我认为这将是现在“旧式”括号样式的现代替代品。我知道情况并非总是如此(明显的例子,vector<int>),但我偶然发现了另一个我不明白的区别。
class Object {
public:
Object() = default;
Object(const Object&) = default;
};
int main() {
Object o;
Object copy{o}; // error
Object copy2(o); // OK
}
在clang3.5下编译失败,报错:(gcc下也失败)
error: excess elements in struct initializer
Object 有两个不同的更改可以实现这一点。要么给它添加一个数据成员,要么给它一个空的拷贝构造函数体
class Object {
private:
int i; // this fixes it
public:
Object() = default;
Object(const Object&) { } // and/or this fixes it as well
};
我不明白为什么这些会有所作为。
【问题讨论】:
-
添加数据成员允许对其进行聚合初始化。添加空主体使构造函数变得不平凡。
-
即如果类是一个聚合类,聚合初始化将被执行,而不管括号初始化列表中初始化器的数量和类型。添加空主体使类成为非聚合类(因为现在 ctor 是用户提供的)。
-
抱歉,将成员添加为公共允许对其进行聚合初始化(给出适当的转换错误)。将其添加为私有可能会影响类的属性,但我不确定。
-
@chris 事实上,如果一个类有一个私有或受保护的成员 => 它不是一个聚合。
-
“但我仍在理解统一初始化,所以我可能遗漏了一个关键概念。” 它对每种类型都有相同的形式,但语义不同.
标签: c++ c++11 copy-constructor uniform-initialization