避免const重载和RVO的代码重复

avoiding code duplication for const-overload and RVO

本文关键字:代码 RVO const 重载 避免      更新时间:2023-10-16

为了在处理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方法中的非const函数调用,可能会修改对象并且不会被注意到(因为const_cast)。从非const到const的常量转换应该不会引起任何问题。

这里的问题是:因为我不能const_cast对象- 是可能的,因为调用lightCopy()返回const对象和实际返回类型不是const - RVO将不可能和一个额外的副本将被制作?

如果源和目标具有相同的"cv-un限定类型",则允许临时对象的复制省略。第31段列表中的第三项:

如果要将未绑定到引用(12.2)的临时类对象复制/移动到具有相同cv- undefined类型的类对象,则可以通过将临时对象直接构造为省略的copy/move

的目标来省略复制/移动操作。

也就是说,引用的代码复制省略是允许的。

在原始示例中插入析构函数表明,clang、Intel的编译器和EDG的前端会删除副本,而gcc不会。也就是说,只有两个析构函数调用,这意味着所有可能可省略的副本都被省略了。不管b是如何声明的,副本都会被省略。我已经使用autoAA const声明了b