为了在处理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将不可能会另外制作副本吗?
答案 0 :(得分:2)
如果源和目的地根据列表中的12.8 [class.copy]第31段第3项具有相同的“cv- un 限定类型”,则允许复制临时对象的省略:< / p>
当一个未绑定到引用(12.2)的临时类对象被复制/移动到具有相同cv-nonqualified类型的类对象时,可以通过直接构造临时对象来省略复制/移动操作进入省略的复制/移动目标
即,引用的代码复制省略 是允许的。
在原始示例中检测析构函数会显示clang,Intel's compiler和EDG's frontend忽略副本,而gcc则不会。也就是说,只有两个析构函数调用暗示所有可能的elidable副本都被省略。这些副本与b
的声明方式无关。我已使用b
,auto
和A
声明A const
。