这是演员还是建筑?

Joh*_*0te 11 c++ constructor casting

在阅读教科书中的内容后,我有点困惑.关于代码:

void doSomeWork(const Widget& w)
{
    //Fun stuff.
}

doSomeWork(Widget(15));
Run Code Online (Sandbox Code Playgroud)

doSomeWork()拿一个const Widget&参数.教科书Effective C++ III指出,这会创建一个临时Widget对象以传递给doSomeWork.它说这可以替换为:

doSomeWork(static_cast<Widget>(15));
Run Code Online (Sandbox Code Playgroud)

因为两个版本都是强制转换 - 第一个版本只是一个功能风格的C版本.我原本以为Widget(15)会调用一个构造函数来获取一个整数参数.

在这种情况下是否会执行构造函数?

AnT*_*AnT 13

在C++中,这种表达式一种演员表,至少在句法上是这样.即,您使用C++函数转换语法Widget(15)来创建类型的临时对象Widget.

即使使用多参数构造函数构造临时(如Widget(1, 2, 3)),它仍然被认为是函数强制表示法的变体(见5.2.3)

换句话说,你的"这是一个演员或建筑"的问题是错误陈述的,因为它暗示了演员和"建筑"之间的相互排他性.它们不是相互排斥的.事实上,每个类型转换(无论是显式转换还是更隐式)都只是目标类型的新临时对象的创建("构造")(可能是某些引用初始化).

BTW,功能强制表示法主要是C++表示法.C语言没有功能样式的强制转换.


Pla*_*aHH 5

简短:是的.

长:

您可以自己测试这些东西,例如:

#include <iostream>

struct W
{
    W( int i )
    {
        std::cout << "W(" << i << ")\n";
    }
};

int main(int argc, const char *argv[])
{
    W w(1);
    W(2);
    static_cast<W>(3);
}
Run Code Online (Sandbox Code Playgroud)

正在输出

W(1)
W(2)
W(3)
Run Code Online (Sandbox Code Playgroud)

  • @MSalters:对于大多数类型而言,强制转换与创建(临时)对象没有什么不同. (2认同)