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

Posted

技术标签:

【中文标题】为啥在 C++ 中调用原始类型的构造函数是合法的?【英文标题】:Why is it legal in C++ to call a constructor of a primitive type?为什么在 C++ 中调用原始类型的构造函数是合法的? 【发布时间】:2015-07-31 13:35:20 【问题描述】:

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

bool a(false);

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

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

【问题讨论】:

这是合法的,因为语言的设计者是这么说的。将其定为非法的充分理由是什么? int x(5) 也是允许的。如果我们愿意,“构造函数”只是一个空操作。 为什么普通类型不能有构造函数? 我猜它和int x(5)没有什么不同,只是我以前从未见过这种语法。我只知道bool a false ;bool a = false;。所以我只是好奇.. @Paladin bool a false ;bool a(false); 相同 表单在 c++11 之前不可用 【参考方案1】:

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

T tVar(initialVal);

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

【讨论】:

这应该被接受为答案。我真的很喜欢这个答案,因为它解释了这种语法背后的真正原因。 Bjarne Stroustrup 在他的书“C++ 编程语言”第 6.2.8 节中也说过这样的话。 +5 赞成。现在它的投票比接受的答案多 2 倍。希望你现在得到金徽章。 ;-)【参考方案2】:

这只是初始化 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 c = bool(); // initializes to false你确定吗? @user3528438,是的,在该语句之后,c 将是一个 boolfalse 作为值。 有趣,我认为bool c = bool(); 等同于bool c;,如果c 不是静态存储持续时间,它会给c 一个不确定的值。【参考方案3】:

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

int a(5);

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

【讨论】:

这看起来不像是值初始化。 我想你的意思是直接初始化。 你说的都是对的。总有一天我会得到正确的名称,而无需仔细检查 cppreference!

以上是关于为啥在 C++ 中调用原始类型的构造函数是合法的?的主要内容,如果未能解决你的问题,请参考以下文章

为啥调用静态成员函数。或 -> 语法合法? [复制]

在 c++ 中的菱形问题中,为啥我们需要从子类中调用祖父构造函数?

为啥我不能在 C++ 中用 new 调用参数化构造函数?

为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?

C++ 为啥基类/结构构造函数不能有多个参数可以从派生中隐式调用?

为啥在malloc中不调用构造函数? [复制]