看了教科书上的一些东西后,我有点困惑。关于代码:
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++ 中,这种表达式是强制转换的一种形式,至少在语法上是这样。 IE。您使用 C++ 函数式转换语法 Widget(15)
创建类型为 Widget
的临时对象。
即使您使用多参数构造函数(如 Widget(1, 2, 3)
)构造一个临时对象,它仍然被认为是函数式转换的变体表示法(见5.2.3)
换句话说,您的“这是一个类型转换还是一个建筑”问题表述不正确,因为它暗示了类型转换和“建筑”之间的互斥性。它们并不相互排斥。事实上,每个类型转换(无论是显式转换还是更隐式的转换)都不过是创建(“构造”)目标类型的新临时对象(可能不包括一些引用初始化)。
顺便说一句,函数式转换符号主要是 C++ 符号。 C 语言没有函数式转换。
关于c++ - 这是 Actor 还是建筑?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7612006/