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

标签 c++ reference constants

我现在对 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/

相关文章:

C++ 字符串文字和常量

在 vector 中使用删除的 C++ 段错误

C++ 没有构造函数的实例与参数列表匹配?

具有引用返回类型的 C++ 类成员函数

c# - 何时应使用引用以及何时应使用项目引用

c++ - 在 C 中允许重复的 const 限定符但在 C++ 中不允许?

c++ - 如何删除 TreeView 中所选项目下的所有项目

c++ - 编译错误 : g++-v4/tr1_impl/type_traits(226): error: expected an identifier

ios - 防止 NSManagedObject 引用更新 UITableViewCell

c++ - 为什么 C++ 不允许在复制构造函数中将非 const 转换为 const?