Может ли компилятор сделать автоматическое преобразование lvalue-to-rvalue, если он может доказать, что lvalue больше не будет использоваться? Вот пример, чтобы уточнить, что я имею в виду:
void Foo(vector<int> values) { ...}
void Bar() {
vector<int> my_values {1, 2, 3};
Foo(my_values); // may the compiler pretend I used std::move here?
}
Если в прокомментированную строку добавлен std::move
, тогда вектор можно переместить в параметр Foo
, а не скопировать. Однако, как написано, я не использовал std::move
.
Довольно легко статически доказать, что my_values не будут использоваться после прокомментированной строки. Итак, компилятор разрешил перемещать вектор, или ему нужно его скопировать?