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