2015-12-06 96 views
1

具體而言,我不知道爲什麼這個編譯:爲什麼我可以使用make_unique創建具有衰減數組指針的unique_ptr?

#include <memory> 
#include "make_unique.hpp" 
void foo(const char *s){ 
    std::unique_ptr<const char*>ptr = std::make_unique<const char*>(s); 
} 

,這並不:

#include <memory> 
#include "make_unique.hpp" 
void foo(const char *s){ 
    std::unique_ptr<const char*>ptr(s); 
} 

似乎是工作,當我把它寫像make_unique實現:

#include <memory> 
#include "make_unique.hpp" 
#include <iostream> 
std::unique_ptr<const char*> foo(const char *s){ 
    /* return std::make_unique<const char*>(s); */ 
    return std::unique_ptr<const char*>(new decltype(s)(std::forward<decltype(s)>(s))); 
} 
int main(){ 
    const char * s = "bar"; 
    std::unique_ptr<const char*>ptr = foo(s); 
    std::cout<<*ptr; 

} 

編輯*錯誤(截斷)

error: no matching conversion for functional-style cast from 'const char *' to 'std::unique_ptr<const char *>' 
    return std::unique_ptr<const char*>(s); 
      ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
/usr/lib/gcc/x86_64-linux-gnu/4.9/../../../../include/c++/4.9/bits/unique_ptr.h:169:7: note: candidate constructor not viable: no known 
     conversion from 'const char *' to 'pointer' (aka 'const char **') for 1st argument; take the address of the argument with & 
     unique_ptr(pointer __p) noexcept 
    ^
+1

這將是有益的,如果你能告訴我們你得到實際的錯誤,因爲這可能解釋了「爲什麼」。 –

+2

我認爲你正在指定一個無意間的額外間接級別。 '標準::的unique_ptr '是一個包裝'X *'不是'X' – JSF

回答

2
  1. std::make_unique<T>(args...)期望從args...構建T

  2. std::unique_ptr<T>(p)預計pT *類型的擁有值。

注意到,您的唯一指針車型const char **,而不是一個const char *。因此,在(1)創建一個新的,動態分配的字符指針,它的值是s(2)你想創建一個獨特的指針取得所有權從複製的東西,然而,但你傳遞一個構造函數參數錯誤的類型。

+0

,幫助我稍微總結我的頭周圍。是否有性病之間的實際差別::的unique_ptr 和std ::的unique_ptr ? – Mikel

+0

@Mikel:他們是完全不同的東西。前者保存一個指向「T」數組的第一個元素的指針;後者指向一個動態分配的'T *'。這是比較蘋果和熊。感興趣的實際比較是'的unique_ptr '和'的unique_ptr ',兩者都可以從擁有'T *被構造'之間。 –

相關問題