У меня есть сегмент, похожий на следующий.
struct derive : base{
derive(unique_ptr ptr): base{func(ptr->some_data), std::move(ptr)}{}
};
В теории, он должен работать. Но поскольку компилятор (vs2015) строго не соответствует стандарту, порядок func(ptr->some_data), std::move(ptr)
равен undefined, т.е. ptr
может быть перемещен перед доступом.
Итак, моя проблема заключается в том, как заставить этот сегмент работать должным образом?
Полный код:
#include <memory>
struct base {
virtual ~base() = 0 {}
protected:
base(std::unique_ptr<base> new_state) :
previous_state{ std::move(new_state) } {}
private:
std::unique_ptr<base> previous_state;
};
struct derive_base : base {
int get_a() const noexcept {
return a;
}
protected:
derive_base(int const new_a, std::unique_ptr<base> new_state) :
base{ std::move(new_state) }, a{ new_a } {}
private:
int a;
};
struct final_state : derive_base {
final_state(std::unique_ptr<base> new_state) :
derive_base{ dynamic_cast<derive_base&>(*new_state).get_a(), std::move(new_state) } {}
};