我正试图创建一个智能指针(unique_ptr
(,指向作为const int&
返回的值,但我的问题可以简单地总结为:
const int value = 5;
const int * ptr{nullptr};
ptr = &value;
这是有效的,并按预期编译。当尝试使用智能指针进行相同操作时:
const int value = 5;
std::unique_ptr<const int> ptr{nullptr};
ptr = &value;
有了这个,我得到了编译错误:
no operator "=" matches these operands -- operand types are: std::unique_ptr<const int, std::default_delete<const int>> = const int *
有可能得到与普通C指针相同的行为吗?
编辑:我发现我最初的问题过于简化了:这是一个更高级的版本:
int value = 5;
const int& getValue(){
return value;
};
std::unique_ptr<const int> ptr1{nullptr};
const int * ptr2{nullptr};
ptr1 = std::make_unique<const int>(getValue());
ptr2 = &getValue();
std::cout << "ptr1: " << *ptr1 << "n";
std::cout << "ptr2: " << *ptr2 << "n";
value++;
std::cout << "ptr1: " << *ptr1 << "n";
std::cout << "ptr2: " << *ptr2 << "n";
打印出来:
ptr1: 5
ptr2: 5
ptr1: 5
ptr2: 6
正如你所看到的,行为有点不同,现在我相信这是因为make_unique
复制了指向内存地址中的值
std::unique_ptr
不能由原始指针直接赋值;您可以使用reset
。但你不应该分配value
的地址(当它自动离开作用域时会被破坏(,std::unique_ptr
会尝试将指针delete
指向UB。
你可能想要
int value = 5; // we'll constructor a new object, value doens't need to be const
std::unique_ptr<const int> ptr{nullptr};
ptr = std::make_unique<const int>(value); // construct a new object and pass the ownership to ptr
编辑
为了使用智能指针,
智能指针用于确保对象在不再使用(引用(时被删除。
如果您不希望智能指针管理对象,或者不能让智能指针拥有对象,则不应该使用智能指针。对于这种特殊情况,我认为使用原始指针是很好的。
std::unique_ptr
是原始指针和内存分配机制的包装器。它更多的是关于内存分配。它的设计目的是自动创建和销毁对象。
此行:
auto ptr = std::make_unique<const int>(5);
相当于:
auto ptr = new const int{5};
所以在你的行
ptr1 = std::make_unique<const int>(getValue());
ptr1指向一个const int类型的新对象,该对象使用getValue((返回的值初始化。
并且您不会在程序中更改此值。如果你这样尝试:
*ptr.get() += 1;
您将得到编译错误,因为int是const。