Вам не удастся удалить этот временный объект в его нынешней форме.
Хотя язык пытается ограничить создание («материализацию») временных (таким образом, как это предусмотрено стандартом и не требует) не влияет на правило «как если бы»), бывают случаи, когда ваши временные должны быть материализованы и включают в себя:
[class.temporary]/2.1
: - при привязке ссылки к prvalue
Вы делаете это здесь, в аргументе конструктора.
Фактически, если вы посмотрите на пример программы в этом абзаце стандарта он почти такой же, как и у вас, и описывает, как временную не нужно создавать в main
, а затем копировать в новую временную переменную, которая входит в аргумент вашей функции… но временная - это создано для этого аргумента функции. Обойти это невозможно.
Копирование члену происходит в обычном порядке. Теперь вступает в силу правило «как будто», и в этом правиле просто нет исключения, позволяющего изменять семантику конструктора B
(включая представление вывода "copied"
) так, как вы надеялись.
Вы можете проверить выходные данные сборки для этого, но я предполагаю, что без выходных данных не будет необходимости фактически выполнять какие-либо операции копирования, и компилятор может исключить ваше временное хранилище, не нарушая правило «как будто» (то есть в обычном порядке его деятельность при создании компьютерной программы из вашего C ++, которая является просто абстрактным описанием программы). Но тогда это всегда имело место, и я думаю, вы уже это знаете.
Конечно, если вы добавите B(A&& a) : a(std::move(a)) {}
, тогда вы переместите объект в элемент вместо этого, но я думаю, ты тоже это знаешь.