【发布时间】: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<unique_ptr<C>> 中构造的,而一些函数获得一个对其元素之一的 (const) 引用。
【问题讨论】:
-
只需使用
std::unique_ptr<const TinyClass>。 -
更糟糕的是:您可以更改 const 对象的引用成员变量。
-
第一个 sn-p 看起来也很可疑。尝试将任何内容分配给 i。
-
我的声明示例:请参阅stacked-crooked,这意味着不会在引用/指针上维护 const
-
如果你有一个内置指针,你可以这样声明,因为内置指针有特殊的 const 传播规则。遗憾的是,Shared_ptr 和其他模板无法模拟这种行为,因为该语言没有必要的机制。
标签: c++ pointers reference constants