目前我想知道如何正确使用std::unique_ptr
作为const正确性的成员变量。const使用std :: unique_ptr/std :: shared_ptr正确组合
下面的例子允许改变由my_foo
所拥有的内容,尽管正在常量:
#include <iostream>
#include <memory>
struct foo {
foo() : value_ptr_(std::make_unique<int>(3)) {}
void increment() const {
++(*value_ptr_);
}
int get_value() const {
return *value_ptr_;
}
std::unique_ptr<int> value_ptr_;
};
int main() {
const foo my_foo;
std::cout << my_foo.get_value() << std::endl;
my_foo.increment(); // But my_foo is const!
std::cout << my_foo.get_value() << std::endl;
}
更换std::make_unique<T>
与std::make_unique<const T>
好像乍一看很好的解决方案。然而,这不允许改变my_foo
内容,即使它是非常量:
#include <iostream>
#include <memory>
struct foo {
foo() : value_ptr_(std::make_unique<int>(3)) {}
void increment() {
++(*value_ptr_);
}
int get_value() const {
return *value_ptr_;
}
std::unique_ptr<const int> value_ptr_;
};
int main() {
foo my_foo;
std::cout << my_foo.get_value() << std::endl;
my_foo.increment(); // compiler error
std::cout << my_foo.get_value() << std::endl;
}
拥有一个像这个小例子,当然不是非常有意义的指针为int,但在实际的代码unique_ptr
把持不住一个指向多态的基类的指针,即一个我们无法简单地按值存储的对象。
那么这种情况怎么处理得更好呢?
我不知道为什么你允许在'const foo'对象上调用'increment'吗?基于这个名字,不应该被允许在这种情况下被调用 – UnholySheep
我想象的类似于你用原始指针做什么。某种包装类。 – juanchopanza
似乎是[std :: experimental :: propagate_const](http://en.cppreference.com/w/cpp/experimental/propagate_const)的用途。但是我没有足够的知识来写答案。 –