2017-07-24 128 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