У меня есть конструктор для B с некоторым аргументом по умолчанию в зависимости от других аргументов:
struct A
{
int f();
A(const A&) = delete;
A(A&& );
// ....
};
struct B
{
B(A a, int n=a.f()) {//...}
// ...
};
Это явно не работает таким образом, поэтому я хочу использовать конструктор делегата:
struct B
{
B(A a, int n) {//...}
B(A a): B(a, a.f()) {}
};
Это, однако, также не работает, потому что конструктор копирования A удален. Поэтому мне нужно что-то вроде
struct B
{
B(A a, int n) {//...}
B(A a): B(std::move(a), a.f()) {}
};
Насколько я знаю, однако, нет гарантии, что a.f () будет вычислена перед std :: move, поэтому результат не определен. Есть ли возможность получить значение a.f () перед std :: move или мне лучше написать два отдельных конструктора?