Переместить семантику и оценку порядка функций

Предположим, у меня есть следующее:

#include <memory>
struct A { int x; };

class B {
  B(int x, std::unique_ptr<A> a);
};

class C : public B {
  C(std::unique_ptr<A> a) : B(a->x, std::move(a)) {}
};

Если я правильно понимаю правила C ++ относительно «неопределенного порядка параметров функции», этот код небезопасен. Если второй аргументBконструктор сначала создается с помощью конструктора перемещения, затемa теперь содержитnullptr и выражениеa->x вызовет неопределенное поведение (вероятно, segfault). Если первый аргумент создается первым, то все будет работать так, как задумано.

Если бы это был обычный вызов функции, мы могли бы просто создать временный:

auto x = a->x
B b{x, std::move(a)};

Но в списке инициализации класса у нас нет свободы для создания временных переменных.

Предположим, я не могу изменитьBЕсть ли какой-нибудь возможный способ для достижения вышеизложенного? А именно разыменование и перемещениеunique_ptr в том же выражении вызова функции без создания временного?

Что делать, если вы могли бы изменитьBконструктор, но не добавлять новые методы, такие какsetX(int)? Это поможет?

Спасибо

Ответы на вопрос(3)

Ваш ответ на вопрос