A&& a = A();
не дает вам значения.Один из способов восприятия любого значения как значения rvalue состоит в том, что вы не можете получить его адрес.Если вы можете получить его адрес, то это скорее всего lvalue.Итак, в вашем случае
auto address_of_a = &a;
возможно (так, a является lvalue).
decltype(a)
является A && (тип rvalue).поэтому приведение типа к A && даст вам rvalue
A b = a;
, потому что a - lvalue, поэтому он ищет A (const A &).
A b = std::move(a); // or
A b = A{}; // rvalue
будет успешным, поскольку теперь он будет искать A (A &&)
A b;
A c = A{};
b = std::move(c);
не удастся, если вы определите свое перемещение как удаленное, в то время как
b = c;
будет успешным, если вы определите свое назначение копирования.
задание по умолчанию конструкция / копирование конструкция / перемещение или копирование будет работать до тех пор, пока все элементы будут тривиально копировать / перемещать.