c++ - 这是 Actor 还是建筑?

标签 c++ casting constructor

看了教科书上的一些东西后,我有点困惑。关于代码:

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/

相关文章:

c++ - 从 C++ 库通知 Objective C

c++ - int8_t* 和 char*

java - double 等于一个整数总是会转换为该整数吗?

java - 错误: Type mismatch: cannot convert from List<Integer> to ArrayList<Integer>

java - 是否可以调用默认构造函数而不是零参数构造函数?

generics - Kotlin声明签名冲突?

c# - Protobuf-net(反)小数序列化在使用自定义小数原型(prototype)合约(C#/C++ 互操作)时抛出

c++ - 初始化一个未知维度的数组

c# - 如何将 JSON.Net 中的 JObject 转换为 T

c++ - 类 Bar { 运算符 Foo(); }