Вам нужно привести a
к rvalue в вашем примере, чтобы получить ожидаемый эффект, потому что сами имена переменных являются lvalues (это сложная деталь lvalue и rvalues в C ++). Итак, как написано, это правильно C ++, но не делает то, что, как вы думаете, делает.
Если вы приведете его, используя std::move(a)
вместо a
, код теперь делает то, что выхочу и все еще правильно. Это связано с тем, что в C ++ существует специальное правило, согласно которому временные привязки могут быть связаны с const lvalues , более подробное обсуждение которых можно найти здесь . Эта функция очень удобна, когда у вас есть такой код:
void ProcessData(const std::vector<int>& input_vector);
, а затем вы хотите проверить его следующим образом:
ProcessData(std::vector<int>{1, 2, 3, 4, 5});
Это избавляет вас от необходимости явно создаватьобъект перед передачей в качестве const lvalue ссылки. Обратите внимание, что const здесь важен, без него код неверен. Существует более подробное обсуждение этого обоснования здесь .