【发布时间】:2017-07-24 11:44:08
【问题描述】:
我想知道为什么编译时会出错:
const std::unique_ptr<int> get() {
return std::make_unique<int>(10);
}
int main() {
const std::unique_ptr<int> value = get();
return EXIT_SUCCESS;
}
我收到以下错误:
main.cpp: In function ‘int main()’:
main.cpp:10:44: error: use of deleted function ‘std::unique_ptr<_Tp, _Dp>::unique_ptr(const std::unique_ptr<_Tp, _Dp>&) [with _Tp = int; _Dp = std::default_delete<int>]’
const std::unique_ptr<int> value = get();
当我从 get 签名中删除 const 时,它可以正确编译。
有没有办法返回一个常量 unique_ptr ?
【问题讨论】:
-
实际的
std::unique_ptr对象应该是常量,还是它指向的数据? -
@MooingDuck 作为返回类型,这很奇怪。否则,pimpl comes to mind as a case where a const
unique_ptrto a non-const object is sometimes used. 总的来说 const 指向非 const 的指针没有什么奇怪的。如果将指针指向其他地方是错误的,但通过指针改变指向的对象是正确的,则指向非 const 的 const 指针会表达并强制执行这一点。如果一个人遵循某种常见的做法,即把大多数东西都设为 const,除非有理由不这样做,那么指向非 const 对象的 const 指针就会经常出现。 -
@EliahKagan:pimpl 中的
const指针使移动/交换比需要的慢,但是是的,一般情况下,在某些情况下 const 指针是有意义的。 -
这是一个 x/y 问题,我不知道为什么它的投票率如此之高。您声明您希望
unique_ptr保持不变,尽管const返回值即使在像unique_ptr这样的不可复制类型被添加到组合中之前也足够奇怪,但没有解释为什么您认为您想要这种奇怪的东西。我不觉得“为什么我不能做[没有任何明显理由的奇怪事情]”的问题很有用,否则我可以花一整天的时间来发明和发布它们。 -
@MooingDuck 似乎在很多情况下
const指针是一个好主意,至少如果其中一个值const-正确性。当然,如果我们可以完全控制函数签名,则应该使用引用。但是,想到接收指针的一个简单示例是像find_if这样的stdlib 算法在容器中保存指针的范围内(reference_wrapper似乎不值得麻烦&应该是const本身! )。如果有可能在接收函数中意外改变指针,并且发生这种情况,它不会有好的结局。