我很好奇C ++ 11列表初始化。我定义了一个类:
Class1.Class2 Object_Name=new Class1.Class2();
在main函数中,我初始化两个对象来测试我的类。
class base{
base() { cout << "default ctor" << endl;}
base(std::initiazer_list<base> il) { cout << "list initialization << endl;}
base(const base &rhs) { cout << "copy ctor" << endl;}
}
我从“有效的现代C ++”中学到了使用列表初始化语法的调用非常喜欢使用std::initializer_list
的重载。
因此,在我的情况下,我认为第二个ctor将被调用,然而,第三个被调用。
你能解释一下原因吗?
答案 0 :(得分:0)
default ctor
copy ctor
list initialization
所以,从某种意义上说,它是正确的,首先调用复制构造函数将obj
复制到std::initializer_list<base>
,然后调用相应的构造函数重载(这是初始化列表的重载) 。
base obj2{obj}; // copy ctor
正如您所看到的,这包括两个调用,而不是一个调用。一个要复制,一个要列表初始化。列表初始化程序是强烈首选的重载。副本是将参数初始化为该重载。
编辑:gcc和clang在此版本上有所不同。
我认为发生的事情是libstdc++
std::initializer_list
的实现会创建临时对象,而clang会选择复制构造函数而不是初始化列表重载。
EDIT2:
我已经在我的本地系统上检查了这个,与-stdlib=libstdc++
的clang确实为std::initializer_list
创建临时,因此存在对复制构造函数的调用。
所有编译器都是正确的