C++ 显式构造函数和强制转换

C++ explicit constructor and cast

在 Effective C++ 一书中,第 27 项

class Widget {
public:
explicit Widget(int size);
...
};
void doSomeWork(const Widget& w);
doSomeWork(Widget(15)); // create Widget from int
                        // with function-style cast

我不确定调用 doSomeWork 时到底发生了什么。我认为函数 doSomeWork 的参数 w 是由另一个 Widget 对象使用复制构造函数初始化的,但是另一个 Widget 对象在哪里?它是如评论所示通过铸造创建的临时对象吗?谁能详细告诉我doSomeWork函数参数初始化时调用了什么?

函数 doSomeWork 的参数 w 是您在行

中作为参数创建的 Widget

doSomeWork(Widget(15));

doSomeWork 期望 Widget 并且已使用您列出的构造函数明确提供了一个。没有使用编译器提供的复制构造函数,因为 doSomeWork(const Widget &w) 签名使用引用传递语义。

只构造了一个对象,尽管可以使用按值传递,而且聪明的现代编译器会将构造推迟到方法的范围内以避免重复构造。