У меня есть шаблон класса, который назначает 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
, но проблема языка, которая полностью воспроизводима без каких-либо стандартных библиотечных заголовков, по-видимому, только в шаблонах классов:
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);
Других решений пока нет …