复制列表初始化和传统复制初始化之间有什么区别?

时间:2014-02-17 10:02:42

标签: c++ c++11

除了支持多个参数,不允许缩小转换,匹配构造函数采用std :: initializer_list参数,复制列表初始化与传统复制初始化有什么不同?

具体而言,假设有两种用户定义类型,AB

class A {...};
class B {...};

B b;
A a1 = {b};
A a2 = b;

AB的哪种定义会对这两种初始化形式产生影响?例如AB是否有某种定义会使初始化之一合法但另一种非法,或者两者都合法但具有不同的语义,或者两者都是非法的,具有不同的原因?

(假设A没有构造函数采用std :: initializer_list参数。)

编辑:添加指向我的某个相关问题的链接:What is the supposed behavior of copy-list-initialization in the case of an initializer with a conversion operator?

1 个答案:

答案 0 :(得分:9)

复制初始化始终考虑复制构造函数的可用性,而复制列表初始化则不会。

class B {};
struct A 
{
  A(B const&) {}
  A(A const&) = delete;
};

B b;
A a1 = {b};  // this compiles
A a2 = b;    // this doesn't because of deleted copy-ctor

这是因为复制列表初始化与直接列表初始化相同,除了在一种情况下 - A(B const&)explicit,前者失败,而后者将起作用。

class B {};
struct A 
{
  explicit A(B const&) {}
};


int main()
{
    B b;
    A a1{b};    // compiles
    A a2 = {b}; // doesn't compile because ctor is explicit
}