До C ++ 11 и в качестве стандартной идиомы программирования временные значения часто назначаются переменным, чтобы сделать код чище. Для небольших типов обычно делается копия, а для больших типов может быть ссылка, например:
int a = int_func();
T const & obj = obj_func();
some_func( a, obj );
Теперь сравните это со встроенной формой:
some_func( int_func(), obj_func() );
До C ++ 11 это имело почти идентичное семантическое значение. С введением семантики rvalue-reference и move вышеперечисленное полностью изменилось. В частности, вынудив obj
к типу T const &
, вы удалили возможность использовать конструктор перемещения, тогда как для встроенной формы тип может быть T&&
.
Учитывая, что первая является общей парадигмой, есть ли в стандарте что-нибудь, что позволило бы оптимизатору использовать конструктор перемещения в первом случае? То есть может ли компилятор игнорировать привязку к T const &
и вместо этого трактовать его как T&&
, или, как я подозреваю, это нарушит правила абстрактной машины?
Вторая часть вопроса, чтобы сделать это правильно в C ++ 11 (без устранения именованных временных), нам нужно как-то объявить правильную ссылку-значение. Мы также можем использовать ключевое слово auto
. Итак, как же правильный способ сделать это? Мое предположение:
auto&& obj = obj_func();