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语言没有功能样式的强制转换.
简短:是的.
长:
您可以自己测试这些东西,例如:
#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)