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

gra*_*olf 11 c++ visual-c++ c++11

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

bool a(false);
Run Code Online (Sandbox Code Playgroud)

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

我正在使用Visual Studio 2012,如果它是相关的.

das*_*ght 26

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

T tVar(initialVal);
Run Code Online (Sandbox Code Playgroud)

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


Vin*_*Pii 13

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

例如,以下内容有效:

bool a(false);
bool b(a);
bool c = bool(); // initializes to false
Run Code Online (Sandbox Code Playgroud)

值得注意的一件事是

int main(int argc, const char *argv[])
{
  bool f();
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

f 是功能声明!


Cor*_*mer 5

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

int a(5);
Run Code Online (Sandbox Code Playgroud)

原始类型没有构造函数,您调用的是直接初始化

  • 你们都是对的。有一天,我将获得正确的名称,而无需仔细检查 cppreference! (3认同)
  • 这看起来不像值初始化。 (2认同)
  • 我认为你的意思是直接初始化。 (2认同)