Внутриклассный инициализатор ошибки unique_ptr в nullptr с явно определенным конструктором по умолчанию

У меня есть шаблон класса, который назначает 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;
}

Есть идеи?

0

Решение

Как уже отмечалось в комментариях, это ошибка компилятора. Это не проблема в реализации библиотеки 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);
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]