【发布时间】:2018-01-27 22:48:05
【问题描述】:
以下类型具有三个构造函数。请注意,其中一个采用相同类型元素的初始化列表。
struct Foo {
Foo() {
std::cout << "default ctor" << std::endl;
}
Foo(const Foo&) {
std::cout << "copy ctor" << std::endl;
}
Foo(std::initializer_list<Foo>) {
std::cout << "initializer_list<Foo>" << std::endl;
}
};
在使用 initializer_list 初始化对象时,我很惊讶地看到复制构造函数被自动调用的次数与 initializer_list 中的元素一样多。之后调用initializer_list构造函数:
int main()
{
Foo a; // default ctor
Foo b{a, a, a}; // copy ctor + copy ctor + copy ctor + initializer_list<Foo>
return 0;
}
这种行为背后的原因/理由是什么?请注意,如果 Foo 没有复制构造函数,那么初始化 Foo b{a, a, a} 显然是完全可能的(initializer_list 构造函数将是唯一调用的构造函数)。
完整代码在这里:http://coliru.stacked-crooked.com/a/f6e28dbb66746aa2
【问题讨论】:
-
在
bar-example 中,仍然调用了复制构造函数,但是您“看不到”,因为它是默认值。 -
“显然是完全可能的” - 不正确。试试
Foo(const Foo&) = delete; -
Biagio Festa,Yuval Ben-Arie,感谢您的 cmets,这就是我需要的信息!
标签: c++ c++11 constructor copy-constructor initializer-list