使用构造函数和赋值初始化 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 所示=]
像这样声明和初始化 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 语法是不允许的,如