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

C++ C++;变量声明和初始化规则,c++,initialization,declaration,C++,Initialization,Declaration,考虑以下声明和初始化C类型变量的方法: C c1; C c2; c2 = C(); C c3(C()); C c4 = C(); 所有这些都是完全等效的吗?或者,根据C的确切定义,其中一些是否会有所不同?(假设它有公共默认构造函数和复制构造函数)。这意味着: C c1; // default constructor C c2; // default constructor c2 = C(); // default constructor followed by assignme

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

C c1;

C c2;
c2 = C();

C c3(C());

C c4 = C();
所有这些都是完全等效的吗?或者,根据
C
的确切定义,其中一些是否会有所不同?(假设它有公共默认构造函数和复制构造函数)。

这意味着:

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和4也将无法编译。@David True,但在这种情况下,问题明确指出复制构造函数是公共的。因此,如果复制构造函数是私有的,
c3
c4
不会编译,但
c2
仍然会编译,对吗?(包括任务)。调用
func(c2)
-使用私有副本构造函数编译也会失败吗?对于C3,一些编译器(至少Visual Studio)无法区分
C3(C())来自函数声明。您可能需要添加额外的括号以避免编译器警告:
c3((C())
@rom是的,它会返回一个C值。