2

在 C++ 中,这两种初始化类对象的方式在功能上是等效的,还是在某些情况下它们可能具有不同的语义并生成不同的代码?

SomeClass foo(1,2,3);

对比

auto foo = SomeClass(1,2,3);
4

1 回答 1

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)没有调用复制构造函数,它仍然必须存在且可访问(好像根本没有发生优化),否则程序是错误的:

于 2020-06-06T03:16:14.653 回答