除了支持多个参数,不允许缩小转换,匹配构造函数采用std :: initializer_list参数,复制列表初始化与传统复制初始化有什么不同?
具体而言,假设有两种用户定义类型,A
和B
:
class A {...};
class B {...};
B b;
A a1 = {b};
A a2 = b;
A
和B
的哪种定义会对这两种初始化形式产生影响?例如A
和B
是否有某种定义会使初始化之一合法但另一种非法,或者两者都合法但具有不同的语义,或者两者都是非法的,具有不同的原因?
(假设A
没有构造函数采用std :: initializer_list参数。)
编辑:添加指向我的某个相关问题的链接:What is the supposed behavior of copy-list-initialization in the case of an initializer with a conversion operator?
答案 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
}