Мне было интересно о поведении С++, когда значение r передается между функциями.
Посмотрите на этот простой код:
#include <string>
void foo(std::string&& str) {
// Accept a rvalue of str
}
void bar(std::string&& str) {
// foo(str); // Does not compile. Compiler says cannot bind lvalue into rvalue.
foo(std::move(str)); // It feels like a re-casting into a r-value?
}
int main(int argc, char *argv[]) {
bar(std::string("c++_rvalue"));
return 0;
}
Я знаю, когда я внутри функции bar
, мне нужно использовать функцию move
для вызова функции foo
. Теперь мой вопрос: почему?
Когда я внутри функции bar
, переменная str
уже должна быть r-значением, но компилятор действует так, как будто это l-значение.
Может ли кто-нибудь привести некоторую ссылку на стандарт об этом поведении? Спасибо!