gpt4 book ai didi

c++ - 从 const 引用初始化非常量对象时防止复制

转载 作者:可可西里 更新时间:2023-11-01 16:37:07 24 4
gpt4 key购买 nike

我现在对 C++ 引用语义有点困惑。假设我有一个返回常量引用的类:

class foo
{
private:
std::map<int, int> stuff;
public:
const std::map<int, int>& getStuff()
{
return stuff;
}
};

我按如下方式使用它:

foo f;
const std::map<int, int>& s = f.getStuff();

很好,但是如果我按如下方式使用它:

foo f;
std::map<int, int> s = f.getStuff();

到底发生了什么?

如果我理解正确,返回了对 stuff 的 const 引用,并在 s 中创建了一个拷贝,我可以在上面造成严重破坏。有什么办法可以避免这种情况吗?

编辑:

所以对于 std::map 无论如何都无法避免在这里调用复制构造函数...

最佳答案

简短回答:不,您无法阻止它。客户端不能修改原件,但如果您授予客户端对 map 的读取权限,则客户端有责任不对信息做愚蠢的事情;类(class)不可能阻止这种情况。

更长的答案:也许,但不是真的。如果你真的想让复制变得困难,你可以将 map 包装在一个具有私有(private)复制构造函数和赋值运算符的类中。这样 s 赋值将是非法的(被编译器拒绝)。客户端仍然能够零碎地读取 map 的元素并用它们填充新 map ——手动拷贝——但防止这种情况的唯一方法是限制包装类中的读取访问,哪一种违背了 getStuff 的目的。

关于c++ - 从 const 引用初始化非常量对象时防止复制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4300869/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com