Переместить семантику и оценку порядка функций
Предположим, у меня есть следующее:
#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)
? Это поможет?
Спасибо