您如何称呼这两种不同的方式,它们有何不同?
ClassName variable(arg1);
和
ClassName variable = ClassName(arg1);
ClassName variable(arg1);
这是直接初始化。假设它是类类型,则通过将参数传递给合适的构造函数来初始化对象。如果没有合适的构造函数,这是一个错误。
ClassName variable = ClassName(arg1);
这是复制初始化。从概念上讲,它创建并直接初始化一个临时的;然后通过复制或移动临时变量来初始化变量。如果没有合适的移动或复制构造函数,这是一个错误。
在实践中,复制或移动可能会被省略,因此结果将与直接初始化相同 - 除了仍然必须有一个可访问的移动或复制构造函数,即使它没有实际使用。
case 1:
ClassName variable(arg1);
//will initialize variable directly with the type constructor
case 2:
ClassName variable = ClassName(arg1);
//should initialize variable directly with a copy of the rvalue
//however because of RVO optimiziation this is tha same as case 1
RVO 是来自编译器的优化,它消除了对构造/复制/破坏的不必要调用,在这种情况下它们是相同的。