避免const-overload和RVO的代码重复

时间:2015-09-02 22:13:08

标签: c++ rvo

为了在处理const-overload时避免代码重复,我写了类似这样的东西:

#include <memory>

class A
{
    std::shared_ptr<int> _data;
public:
    const A lightCopy() const
    {
        A a;
        a._data = _data;
        return a;
    }

    A lightCopy()
    {
        using const_a_t = const A;
        const_a_t &const_me = *this;
        return const_me.lightCopy(); // const object here
    }
};

int main()
{
    A a;
    auto b = a.lightCopy();
}

const_cast用于非const版本,因为否则它将是const-method中的非const函数调用,它可能会修改对象并且不会被忽视(因为{{1} })。从非const到const的const-casting应该不会引起任何问题。

这里的问题是:因为我不能const_cast一个对象 - 是否可能由于调用const_cast返回const对象而实际返回类型不是const - RVO将不可能会另外制作副本吗?

1 个答案:

答案 0 :(得分:2)

如果源和目的地根据列表中的12.8 [class.copy]第31段第3项具有相同的“cv- un 限定类型”,则允许复制临时对象的省略:< / p>

  

当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动目标

即,引用的代码复制省略 是允许的。

在原始示例中检测析构函数会显示clangIntel's compilerEDG's frontend忽略副本,而gcc则不会。也就是说,只有两个析构函数调用暗示所有可能的elidable副本都被省略。这些副本与b的声明方式无关。我已使用bautoA声明A const