我一直在阅读此页面以了解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization
值初始化的效果是:
- 如果 T 是具有至少一个任何类型的用户提供的构造函数的类类型,则调用默认构造函数。
但这似乎与其他来源直接矛盾,解释说如果至少有一个用户定义的构造函数,那么编译器不会生成隐式默认构造函数(像“T t;”这样的表达式不会编译)。欢迎任何解释。
我一直在阅读此页面以了解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization
值初始化的效果是:
- 如果 T 是具有至少一个任何类型的用户提供的构造函数的类类型,则调用默认构造函数。
但这似乎与其他来源直接矛盾,解释说如果至少有一个用户定义的构造函数,那么编译器不会生成隐式默认构造函数(像“T t;”这样的表达式不会编译)。欢迎任何解释。
在这种情况下,“默认构造函数”是指不接受任何参数的构造函数(因为它没有参数,或者因为它只有可选参数)。
“隐式构造函数”是指自动为您生成的构造函数。这可以是无参数构造函数、复制构造函数或(从 C++11 开始)移动构造函数。
所以,没有矛盾。当 T 是具有用户提供的构造函数的类类型时,值初始化调用默认构造函数。如果它不存在(因为您定义了另一个构造函数但没有无参数构造函数),或者如果它不可访问(因为您将其标记为私有或受保护,然后在无法使用此类函数的地方使用它),那么值初始化格式不正确,编译器将拒绝您的代码。如果它已声明但从未定义,则程序将不会链接。
由于 C++11,“默认”这个词可能有点含糊,因为可以定义一个复制构造函数= default;