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

时间:2015-02-27 15:03:46

标签: c++ constructor casting explicit

在Effective C ++,Item 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函数参数初始化时调用了什么吗?

1 个答案:

答案 0 :(得分:2)

函数w的参数doSomeWork是您在行中作为参数创建的Widget

doSomeWork(Widget(15));

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

只构建了一个对象,虽然可以使用按值传递,但是聪明的现代编译器会将构造推迟到方法的范围,以避免重复构造。