为什么在这种情况下复制构造函数匹配?

时间:2016-12-06 08:04:52

标签: c++11 initialization list-initialization

我很好奇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将被调用,然而,第三个被调用。

你能解释一下原因吗?

1 个答案:

答案 0 :(得分:0)

Demo

default ctor
copy ctor
list initialization

所以,从某种意义上说,它是正确的,首先调用复制构造函数将obj复制到std::initializer_list<base>,然后调用相应的构造函数重载(这是初始化列表的重载) 。

  base obj2{obj}; // copy ctor

正如您所看到的,这包括两个调用,而不是一个调用。一个要复制,一个要列表初始化。列表初始化程序是强烈首选的重载。副本是将参数初始化为该重载。

编辑:gcc和clang在此版本上有所不同。

GCC Head Clang Head

我认为发生的事情是libstdc++ std::initializer_list的实现会创建临时对象,而clang会选择复制构造函数而不是初始化列表重载。

EDIT2: 我已经在我的本地系统上检查了这个,与-stdlib=libstdc++的clang确实为std::initializer_list创建临时,因此存在对复制构造函数的调用。

所有编译器都是正确的