In-class unique_ptr 的成员初始值设定项到具有显式定义的默认构造函数的 nullptr 错误
In-class member initializer of unique_ptr to nullptr error with explicitly defined default constructor
我有一个 class 模板,它使用 in-class 成员初始值设定项将 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;
}
有什么想法吗?
正如评论中已经指出的那样,这是一个编译器错误。这不是 unique_ptr
的库实现中的问题,而是一个无需任何标准库 headers 即可完全重现的语言问题,似乎仅在 class 模板中:
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);
我有一个 class 模板,它使用 in-class 成员初始值设定项将 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;
}
有什么想法吗?
正如评论中已经指出的那样,这是一个编译器错误。这不是 unique_ptr
的库实现中的问题,而是一个无需任何标准库 headers 即可完全重现的语言问题,似乎仅在 class 模板中:
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);