2013-07-20 45 views
3

我一直在阅读本页面以了解值初始化的概念 http://en.cppreference.com/w/cpp/language/value_initialization用户定义的构造和隐含的默认构造函数

值初始化的效果是:

  • 如果T是一个类类型,至少有一个用户提供的任何类型的构造函数,默认构造函数被调用。

但这似乎是在与其他来源的说明,如果存在至少一个用户定义的构造函数,则编译器不会生成隐式默认的构造直接矛盾(表达式像“T吨;”将不会编译)。欢迎任何解释。

回答

3

在此上下文中的“默认构造函数”表示一个构造函数,它不接受任何参数(或者因为它没有参数或者因为它只有可选参数)。

“隐式构造函数”表示自动为您生成的构造函数。这可以是一个无参数构造函数,一个拷贝构造函数或者(从C++ 11开始)移动构造函数。

所以,没有矛盾。当T是具有用户提供的构造函数的类类型时,则值初始化将调用默认的构造函数。如果这不存在(因为您定义了另一个构造函数但没有无参数构造函数),或者它不可访问(因为您将它标记为私有或受保护,然后在不能使用此类函数的地方使用它),则值初始化格式不正确,编译器会拒绝你的代码。如果它被声明但从未定义过,那么程序将不会链接。

由于C++ 11的“默认”一词大概是有些模棱两可的,因为它可以定义一个拷贝构造函数= default;

+0

而且,如果事情被调用,并且不存在程序不编译。它仍然*被称为*,只是一个错误,因为它缺少。 – Yakk

相关问题