为什么函数返回时没有调用复制构造函数?

时间:2013-11-23 14:38:00

标签: c++ copy-constructor

Line Line::operator =(Line ln) {
        cout << "Assignment operator\n";
        Line temp;
        temp.ptr = new int;
        *temp.ptr = *(ln.ptr);
        return temp;
    }

在上面的代码中,执行以下语句时不会调用复制构造函数:

return temp;

由于返回是按值的,为什么不调用复制构造函数?

由于

3 个答案:

答案 0 :(得分:6)

这称为 copy elision :允许按值返回本地对象,而不是本地对象(您的temp })直接在调用者中构造。即使拷贝构造函数有副作用,也允许这样做。

答案 1 :(得分:4)

通过上面的设置,编译器很可能省略了复制构造函数,而是直接在期望返回值的位置构造临时temp。即使复制构造函数具有副作用,也明确允许复制省略。但是,即使复制被删除,复制或移动构造函数仍然必须是可访问的,即复制省略的可能性不会放松相应构造函数的可访问规则。

如果您觉得绝对想要调用复制构造函数,可以强制复制构造,例如,通过身份函数传递结果:

template <typename T>
T const& identity(T const& object) {
    return object;
}
// ...
    return identity(temp);

通常,您希望省略复制构造函数。

答案 2 :(得分:3)

我想在前面的帖子中添加注释,即使在构建目标对象时也省略了复制构造函数,它仍然必须是可访问和定义的。例如,当编译器发出错误时,你的拷贝构造函数会变为私有(除了MS VC ++至少2010年有错误:))