使用显式定义的默认构造函数的unique_ptr到nullptr错误的类内成员初始值设定项

时间:2016-02-26 20:46:13

标签: c++ c++11 unique-ptr explicit-constructor in-class-initialization

我有一个类模板,它使用类内成员初始化程序将unique_ptr分配给nullptr。如果我使用MyClass(){},一切都很好。如果我使用MyClass() = default,我会得到:

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;
}

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

正如评论中已经指出的那样,这是一个编译错误。它在flex的库实现中不是问题,但是在没有任何标准库头的情况下完全可重现的语言问题,似乎只在类模板中:

unique_ptr

幸运的是,它是一个可以解决的编译器错误。隐式转换处理不当。强制进行显式转换,甚至GCC 4.8接受它。在您的情况下,这意味着:

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