为啥在 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
将是一个 bool
与 false
作为值。
有趣,我认为bool c = bool();
等同于bool c;
,如果c
不是静态存储持续时间,它会给c
一个不确定的值。【参考方案3】:
这与任何其他原始类型没有什么不同,例如
int a(5);
原始类型没有构造函数,你调用的是direct-initialization
【讨论】:
这看起来不像是值初始化。 我想你的意思是直接初始化。 你说的都是对的。总有一天我会得到正确的名称,而无需仔细检查 cppreference!以上是关于为啥在 C++ 中调用原始类型的构造函数是合法的?的主要内容,如果未能解决你的问题,请参考以下文章
在 c++ 中的菱形问题中,为啥我们需要从子类中调用祖父构造函数?
为啥 C++ 映射类型参数在使用 [] 时需要一个空的构造函数?