在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?
SomeClass foo(1,2,3);
对比
auto foo = SomeClass(1,2,3);
在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?
SomeClass foo(1,2,3);
对比
auto foo = SomeClass(1,2,3);
第一个是直接初始化。
第二个是拷贝初始化,概念foo
上是从直接初始化的临时拷贝初始化SomeClass
。(顺便说一句,它与 无关operator=
;它是初始化但不是赋值。)
由于强制复制省略(自 C++17 起),它们具有完全相同的效果,对象由适当的构造函数直接初始化。
在对象的初始化中,当初始化表达式是与变量类型相同的类类型(忽略cv-qualification )的纯右值时:
T x = T(T(f())); // only one call to default constructor of T, to initialize x
在 C++17 之前,复制省略是一种优化;即使复制/移动构造可能被省略,适当的复制/移动构造函数也必须可用;如果不是(例如,构造函数被标记为explicit
),则第 2 种样式将不起作用,而第 1 种样式很好。
这是一种优化:即使它发生并且
/move (since C++11)
没有调用复制构造函数,它仍然必须存在且可访问(好像根本没有发生优化),否则程序是错误的: