Guy*_*zmo 0 c++ constructor initializer
像这样声明和初始化类实例有什么区别:
MyClass var(param1, param2);
Run Code Online (Sandbox Code Playgroud)
...和这个?
MyClass var = MyClass(param1, param2);
Run Code Online (Sandbox Code Playgroud)
我隐约记得听说它们在某些时候是等效的,但现在我想知道后一种情况是否也可能调用类的赋值运算符、移动构造函数或复制构造函数,而不仅仅是显式使用的特定构造函数。
后者不是任务。它的语法称为复制初始化:
type_name variable_name = other;
Run Code Online (Sandbox Code Playgroud)
前者是直接初始化:
type_name variable_name(arg-list, ...);
Run Code Online (Sandbox Code Playgroud)
在 C++17 之前,技术上存在通过直接初始化创建临时对象MyClass(param1, param2),并在后一种情况下调用复制(或自 C++11 起移动)构造函数。只要该复制/移动格式良好,就没有实际差异1 ,因为该副本可以被优化掉。但如果类不可复制或不可移动,那么它的格式就会不正确。
从 C++17 开始,即使对于抽象机也没有区别1 。没有临时对象,也没有需要优化的副本。param1, param2 直接传递给初始化的构造函数,var就像之前由于优化而发生的情况一样。
1除非构造函数是显式的,在这种情况下不允许使用复制初始化语法,如Daniel Langr所示。
| 归档时间: |
|
| 查看次数: |
110 次 |
| 最近记录: |