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

时间:2015-07-31 13:35:21

标签: c++ c++11 visual-c++

为什么以下代码在C ++中合法?

bool a(false);

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

我使用Visual Studio 2012是否相关。

3 个答案:

答案 0 :(得分:26)

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

T tVar(initialVal);

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

答案 1 :(得分:13)

这只是初始化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是函数声明!

答案 2 :(得分:4)

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

int a(5);

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