用户自定义构造函数和隐式默认构造函数

4
我一直在阅读这个页面,以了解“值初始化”概念 http://en.cppreference.com/w/cpp/language/value_initialization

值初始化的影响是:

  • 如果T是具有任何一种用户提供的构造函数的类类型,则调用默认构造函数。

但是,这似乎与其他解释相矛盾,即如果至少有一个用户定义的构造函数,则编译器不会生成隐式默认构造函数(表达式“T t;”无法编译)。欢迎任何解释。

1个回答

4
在这个上下文中,“默认构造函数”指的是可以接受零个参数的构造函数(可能是因为它没有参数,也可能是因为它只有可选参数)。
“隐式构造函数”是指自动生成的构造函数。这可以是无参构造函数、拷贝构造函数或(从C++11开始)移动构造函数。
所以,不存在矛盾。当T是具有用户提供的构造函数的类类型时,值初始化调用默认构造函数。如果不存在(因为你定义了另一个构造函数但没有无参构造函数),或者如果不可访问(因为你将其标记为private或protected,然后从不能使用这些函数的地方使用它),那么值初始化就是不合法的,编译器会拒绝你的代码。如果它被声明但从未定义,则程序将无法链接。
自C++11以来,“默认”一词可能有些模糊,因为可以定义一个拷贝构造函数= default;

如果某个东西被调用但不存在,程序就无法编译。它仍然被“调用”,只是因为缺失而出现错误。 - Yakk - Adam Nevraumont

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