读完教科书上的一些内容后,我有点困惑。关于代码:
void doSomeWork(const Widget& w)
{
//Fun stuff.
}
doSomeWork(Widget(15));
doSomeWork()
需要一个const Widget&
范围。教科书《Effective C++ III》指出,这将创建一个临时 Widget 对象以传递给 doSomeWork。它说这可以替换为:
doSomeWork(static_cast<Widget>(15));
因为两个版本都是强制转换 - 第一个版本显然只是函数式的 C 强制转换。我本以为Widget(15)
会调用一个带有一个整数参数的小部件的构造函数。
在这种情况下构造函数会被执行吗?
在C++中这种表达式is一种强制转换的形式,至少在语法上是这样。 IE。您使用 C++ 函数转换语法Widget(15)
创建类型的临时对象Widget
.
即使您使用多参数构造函数构造临时对象(如Widget(1, 2, 3)
)它仍然被认为是一个变体功能铸件符号(见5.2.3)
换句话说,您的“这是强制转换还是构造”问题的表述不正确,因为它意味着强制转换和“构造”之间的相互排他性。它们并不相互排斥。事实上,每个类型转换(无论是显式强制转换或更隐式的转换)无非是目标类型的新临时对象的创建(“构造”)(可能不包括某些引用初始化)。
顺便说一句,函数式转换表示法主要是 C++ 表示法。 C 语言没有函数式类型转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)