0

为了在处理 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_cast)。并且从非 const 到 const 的 const 转换不应该引起任何问题。

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

4

1 回答 1

2

根据 12.8 [class.copy] 第 31 段列表中的第三项,如果源和目标具有相同的“cv- un限定类型”,则允许复制删除临时对象:

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

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

在原始示例中检测析构函数表明clang英特尔的编译器EDG 的前端会删除副本,而gcc不会。也就是说,只有两个析构函数调用暗示所有可能的可删除副本都被删除了。b副本被忽略,与声明方式无关。我已经声明b使用auto,AA const.

于 2015-09-02T22:33:13.477 回答