Как реализовать конструктор копирования std :: option?

Я реализую std::optional, но натолкнулся на одну из своих копировать конструкторы.

Вот эскиз моей реализации:

#include <type_traits>

template<typename T>
class optional
{
public:
constexpr optional()
: m_is_engaged(false)
{}

constexpr optional(const optional &other)
: m_is_engaged(false)
{
operator=(other);
}

constexpr optional &operator=(const optional &other)
{
if(other.m_is_engaged)
{
return operator=(*other);
}
else if(m_is_engaged)
{
// destroy the contained object
(**this).~T();
m_is_engaged = false;
}

return *this;
}

template<typename U>
optional &operator=(U &&value)
{
if(m_is_engaged)
{
operator*() = value;
}
else
{
new(operator->()) T(value);
m_is_engaged = true;
}

return *this;
}

T* operator->()
{
return reinterpret_cast<T*>(&m_data);
}

T &operator*()
{
return *operator->();
}

private:
bool m_is_engaged;
typename std::aligned_storage<sizeof(T),alignof(T)>::type m_data;
};

#include <tuple>

int main()
{
optional<std::tuple<float, float, float>> opt;

opt = std::make_tuple(1.f, 2.f, 3.f);

return 0;
}

Проблема в том, что компилятор жалуется, что optional«s constexpr конструктор не имеет пустого тела:

$ g++ -std=c++11 test.cpp
test.cpp: In copy constructor ‘constexpr optional<T>::optional(const optional<T>&)’:
test.cpp:15:5: error: constexpr constructor does not have empty body
}
^

Я не уверен, как инициализировать optional::m_data в противном случае, и я не смог найти эталонную реализацию в Интернете (boost::optional по-видимому, не использует constexpr).

Какие-либо предложения?

0

Решение

В C ++ 11 функции и конструкторы помечены как constexpr очень ограничены в том, что они могут сделать. В случае конструкторов, он не может содержать ничего, кроме static_assert, typedef или же используя объявления или же используя директивы, что исключает вызов operator= внутри тела конструктора.

2

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

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