2017-07-24 129 views
25

我很奇怪,为什么在编译时,我得到一个错误:C++返回常量的unique_ptr

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?

+2

实际的'std :: unique_ptr'对象应该是常量还是它指向的数据? –

+0

是的,我的意思是实际的'std :: unique_ptr'对象应该是不变的。 – jean553

+0

为什么你需要一个可以改变的数据的常量指针?这很奇怪。 –

回答

53

因为unique_ptr是不变的,所以不能移动只能复制。不允许复制unique_ptr(否则它不会是“唯一的”)。

如果指针指向的数据应该是常量,则改为使用std::unique_ptr<const int>

+2

只是一个快速提示:OP的例子必须在C++ 17中编译,因为保证了copy elision。 – bogdan