使用构造函数和赋值初始化 class 实例之间有什么区别吗?

Is there any difference between initializing a class instance with a constructor versus an assignment?

像这样声明和初始化 class 实例有什么区别吗:

MyClass var(param1, param2);

...还有这个?

MyClass var = MyClass(param1, param2);

我依稀记得听说它们在某些时候是等价的,但现在我想知道后一种情况是否也可以调用 class 的赋值运算符、移动构造函数或复制构造函数,而不是只是明确使用的特定构造函数。

后者不是作业。它的语法称为复制初始化:

type_name variable_name = other;

前者是直接初始化:

type_name variable_name(arg-list, ...);

在 C++17 之前,在技术上从直接初始化 MyClass(param1, param2) 中创建临时对象,并在后一种情况下调用复制(或自 C++11 起移动)构造函数。只要 copy/move 是 well-formed 就没有实际区别1,因为允许优化该副本。但如果 class 不可复制也不可移动,则它会是 ill-formed。

从 C++17 开始,即使对于抽象机也没有区别1。没有临时对象,也没有需要优化的副本。 param1, param2 直接传递给初始化 var 的构造函数,就像之前由于优化而发生的情况一样。

1 除了构造函数是显式的情况外,在这种情况下 copy-initialisation 语法是不允许的,如 .[=16 所示=]