默认初始化显式构造函数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
}