为什么在 C++ 中调用基本类型的构造函数是合法的?

Why is it legal in C++ to call a constructor of a primitive type?

为什么下面的代码在C++中是合法的?

bool a(false);

我的意思是,T a(VALUE) 应该调用构造函数,对吗?我想它没有被解析为函数声明。但是 bool 是普通类型,它没有构造函数。或者是吗?

如果相关,我正在使用 Visual Studio 2012。

这与任何其他原始类型没有什么不同,例如

int a(5);

原始类型没有构造函数,你调用的是direct-initialization

这只是初始化 POD 类型的有效语法,并且具有与构造函数(甚至是复制构造函数)类似的行为。

例如,以下是有效的:

bool a(false);
bool b(a);
bool c = bool(); // initializes to false

一件有趣的事情是在

int main(int argc, const char *argv[])
{
  bool f();
  return 0;
}

f是一个函数声明!

虽然 bool 是原始类型,因此没有构造函数,但语言设计者引入了适用于原始类型和 类 的统一初始化语法。这大大简化了模板代码的编写,因为您可以继续使用

T tVar(initialVal);

语法,不知道 T,一个模板类型参数,是否是原始的。这对模板设计者来说是一个非常重要的好处,因为他们不再需要根据原始与 类.

来考虑模板类型参数。