0

我有一個類模板,它使用類內成員初始值設定項將unique_ptr指定給nullptr。如果我使用MyClass(){},一切都很好。如果我使用MyClass() = default,我得到:具有顯式定義的默認構造函數的unique_ptr到nullptr錯誤的類內成員初始值設定項

conversion from 'std::nullptr_t' to non-scalar type 'std::unique_ptr<A>' requested 

下面是一個小例子,其失敗的g ++ 4.8.4編譯:

#include <memory> 

class A{}; 

template <typename T> 
class Test 
{ 
    std::unique_ptr<A> data = nullptr; 
public: 

    //Test() {} // works fine 
    Test() = default; // compiler error 

}; 

int main() 
{ 
    Test<float> test; 
} 

任何想法?

+0

那麼,我們不會最小化你的未知(對我們)代碼。 – SergeyA

+0

@SergeyA這是一個非常有用的評論。做得好。 – Anthony

+0

您的代碼在gcc上編譯得很好:[在線試用](http://ideone.com/fD6Hyr) – Anedar

回答

1

正如已經在評論中指出的那樣,這是一個編譯器錯誤。這不是在圖書館實施的unique_ptr一個問題,而是一個語言問題,那就是沒有任何標準庫頭完全可再現的,貌似只有在類模板:

struct A { A(int); }; 
struct B { A a = 1; }; 
B b; // ok 
template <typename T> struct C { A a = 1; }; 
C<void> c; // error 

幸運的是,這是一個編譯器錯誤,就可以解決。隱式轉換處理不當。強制顯式轉換,甚至GCC 4.8接受它。在你的情況下,這意味着:

std::unique_ptr<A> data = std::unique_ptr<A>(nullptr); 
+0

unique_ptr默認也是nullptr,對嗎?明確地將其設置爲nullptr還是不好? –

+1

@DavidDoria是的,那是默認設置。我可以想出有效的論點來反對明確提供一個初始者,並且不要回想起最佳實踐的共識。 – hvd

+0

小心使他們在600個字符或更少:)? –

相關問題