默认初始化显式构造函数c++
Default initialization explicit constructor c++
如果默认构造函数是显式的,默认初始化在 C++11 中如何工作?例如:
#include <iostream>
struct Foo {
int x;
explicit Foo(int y = 7) : x{y} {}
}
int main() {
Foo foo;
std::cout << foo.x << std::endl;
}
在main中,变量foo
是默认初始化的。根据我的理解,这将调用默认构造函数(如果存在)。否则,不会发生初始化,foo
包含不确定的值,并且打印 foo.x
是未定义的行为。
Foo
有一个默认构造函数,但它是显式的。是保证调用该构造函数,还是程序的最后一行未定义行为?
您的使用没问题。可能发生的最糟糕的事情是编译器将无法使用构造函数,因为它是显式的并且无法编译。但是,按照您的方式定义变量将正确调用 explicit
默认构造函数。
对默认构造函数使用 explicit
可防止如下用途:
Foo some_fn() {
return {}; // Fails as the default constructor is explicit.
return Foo{}; // OK
}
如果默认构造函数是显式的,默认初始化在 C++11 中如何工作?例如:
#include <iostream>
struct Foo {
int x;
explicit Foo(int y = 7) : x{y} {}
}
int main() {
Foo foo;
std::cout << foo.x << std::endl;
}
在main中,变量foo
是默认初始化的。根据我的理解,这将调用默认构造函数(如果存在)。否则,不会发生初始化,foo
包含不确定的值,并且打印 foo.x
是未定义的行为。
Foo
有一个默认构造函数,但它是显式的。是保证调用该构造函数,还是程序的最后一行未定义行为?
您的使用没问题。可能发生的最糟糕的事情是编译器将无法使用构造函数,因为它是显式的并且无法编译。但是,按照您的方式定义变量将正确调用 explicit
默认构造函数。
对默认构造函数使用 explicit
可防止如下用途:
Foo some_fn() {
return {}; // Fails as the default constructor is explicit.
return Foo{}; // OK
}