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个字符或更少:)? –