C++变量声明和初始化规则

3
考虑以下声明和初始化 C 类型变量的方法:
C c1;

C c2;
c2 = C();

C c3(C());

C c4 = C();

这些是否完全等价,或者某些情况下可能因C的确切定义而有所不同?(假设它具有公共默认和复制构造函数。)

1个回答

10

这些意味着:

C c1;   // default constructor

C c2;   // default constructor
c2 = C(); // default constructor followed by assignment

C c3(C());   // default constructor possibly followed by copy constructor

C c4 = C();  // default constructor possibly followed by copy constructor

请注意编译器可以省略复制构造函数的调用。它们是否等效?这取决于复制构造函数和赋值运算符的实现。

3
注意,重要的是即使复制构造函数被省略了,仍需检查要求。也就是说,如果在这个级别上复制构造函数不可访问(私有/受保护),即使从未调用复制构造函数,3和4仍将无法编译通过。 - David Rodríguez - dribeas
@David 对的,但在这种情况下,问题明确说明复制构造函数是公共的。 - anon
如果复制构造函数是私有的,那么c3c4将无法编译,但c2仍然可以(包括赋值)。那么对于调用func(c2)呢?这也会因为私有复制构造函数而无法编译吗? - Roman Starkov
4
对于C3,有些编译器(至少包括Visual Studio)无法将C c3(C());与函数声明区分开来。为了避免编译器警告,您可能需要添加额外的括号:C c3((C())); - a1ex07
是的,返回 C 值也可以。 - anon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接