【问题标题】:const reference to a pointer can change the objectconst 对指针的引用可以改变对象
【发布时间】:2016-12-22 08:11:08
【问题描述】:

const 引用确保您不能更改所引用的对象。例如:

int i = 1;
const int& ref = i;
ref = 42; // error, because of a const reference

但是,如果您使用对指针或unique_ptr 的引用,则可以。示例:

class TinyClass {
public:
    int var = 1;
    void f1() { var = 42; }
};

std::unique_ptr<TinyClass> pointer(new TinyClass);
const std::unique_ptr<TinyClass>& constRef = pointer;
constRef->f1(); // no error

我认为这是因为指针本身没有改变。但这感觉misleading,或者像一个简单的错误。有没有一种简单的方法来声明对指针的“真实” const 引用?如:确保对象本身是 const。

edit:假设我不能只更改 unique_ptr 的类型。一个真实的场景是一些对象是在 vector&lt;unique_ptr&lt;C&gt;&gt; 中构造的,而一些函数获得一个对其元素之一的 (const) 引用。

【问题讨论】:

  • 只需使用std::unique_ptr&lt;const TinyClass&gt;
  • 更糟糕的是:您可以更改 const 对象的引用成员变量。
  • 第一个 sn-p 看起来也很可疑。尝试将任何内容分配给 i。
  • 我的声明示例:请参阅stacked-crooked,这意味着不会在引用/指针上维护 const
  • 如果你有一个内置指针,你可以这样声明,因为内置指针有特殊的 const 传播规则。遗憾的是,Shared_ptr 和其他模板无法模拟这种行为,因为该语言没有必要的机制。

标签: c++ pointers reference constants


【解决方案1】:

const std::unique_ptr&lt;TinyClass&gt;&amp; constRef 中的const 保证constRef 在设置后不会指向另一个对象。它与对象本身无关。

如果你想防止改变对象本身:

std::unique_ptr<const TinyClass> ptr_to_const_object;

编辑(在 OP 编辑​​之后):

你什么也做不了。由于有一个函数需要const vector&lt;unique_ptr&lt;C&gt;&gt;&amp;,因此该函数清楚地告诉您它需要使用指针(甚至指针)内的对象,但它不需要更改向量项(例如添加新项或删除它)。

【讨论】:

  • 对,这将是最简单的方法。但在我的实际用例中,该对象位于 unique_ptrs 的向量中。我无法改变这一点。一个函数正在接收对这些对象之一的 (const) 引用。这就是我发现 const 并不意味着它看起来的地方
猜你喜欢
  • 2021-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 2021-06-04
  • 2016-07-18
  • 2011-04-17
  • 2010-09-18
相关资源
最近更新 更多