在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函数参数初始化时调用了什么吗?
答案 0 :(得分:2)
函数w
的参数doSomeWork
是您在行中作为参数创建的Widget
doSomeWork(Widget(15));
doSomeWork
期望Widget
,并且已使用您列出的构造函数显式提供了一个。没有使用编译器提供的拷贝构造函数,因为doSomeWork(const Widget &w)
签名使用传递引用语义。
只构建了一个对象,虽然可以使用按值传递,但是聪明的现代编译器会将构造推迟到方法的范围,以避免重复构造。