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

C++ explicit constructor and cast

本文关键字:转换 构造函数 C++      更新时间:2023-10-16

在《有效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)签名使用了传递引用语义。

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