copy-initialization vs direct-initialization
- LINDA
- 2018/8/31
copy-initialization
指用一个对象初始化另外一个对象:
在下面这6种情况下发生:
T object = other; //(1) 当一个非引用类型T的具名变量通过 '=' 被一个表达式初始化时 T object = { other}; //(2) 当一个纯量类型T的具名变量通过 '=' 被一个括号表达式初始化时 f(other) //(3) 当通过值传递给函数的参数时 return other; //(4) 当函数返回一个值时 throw object; catch(T object) //(5) 当throw/catch 一个表达式的值时 T array[N] = { other}; //(6) 使用聚合初始化,初始化每个元素
注意:
copy-initialization
权限少于direct-initialization
:explicit
构造函数不能作为转换构造函数converting constructors
,并且不能用于copy-initialization
:
也就是说**explicit
修饰的构造函数都不能用于copy-initialization
**。如,智能指针就把它们的构造函数声明为explicit
,所以,智能指针智能使用 direct-initialization
.
class Test {
public:
explicit Test(const Test&) {
// ...
}
// ...
};
Test T;
Test T1(T); // Ok
Test T2 = T1; // Error!
shared_ptr<int> sp = new int(8); // Error!
shared_ptr<int> sp(new int(8)); // OK
https://en.cppreference.com/w/cpp/language/copy_initialization
copy-initialization
不允许隐式转换,必须直接由初始化器(先类型转换等)产生T类型。例如:
struct S {
S(std::string) {
} }; // 允许隐式转换
S s("abc"); // OK, direct-initialization,const char[4]隐式转换为string
S s = "abc"; // Error, copy-initialization,无法转换
S s