你如何称呼这两种不同的方式,它们有何不同?
ClassName variable(arg1);
和
ClassName variable = ClassName(arg1);
答案 0 :(得分:5)
ClassName variable(arg1);
这是直接初始化。假设它是类类型,则通过将参数传递给合适的构造函数来初始化对象。如果没有合适的构造函数,则会出错。
ClassName variable = ClassName(arg1);
这是 copy-initialisation 。从概念上讲,它创建并直接初始化临时;然后通过复制或移动临时来初始化变量。如果没有合适的移动或复制构造函数,则会出错。
实际上,复制或移动可能会被省略,因此结果将与直接初始化相同 - 除非必须仍有可访问的移动或复制构造函数,即使它实际上并未使用。
答案 1 :(得分:2)
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是编译器的优化,它删除了对构造/复制/销毁的不必要的调用,在这种情况下它们是相同的。