C++ 为什么在此示例中更改了 int 右值引用?
C++ why int rvalue reference changed in this example?
#include <iostream>
using namespace std;
int&& a(int&& b) {
cout << b << endl; //output 5
return std::move(b);
}
string&& d(string&& e) {
cout << e << endl; //output abc
return std::move(e);
}
int main() {
// your code goes here
int&& b = a(5);
cout << b<< endl; // output 0
string&& f = d("abc");
cout << f << endl; //output abc
return 0;
}
函数 a 应该 return 对 5 的右值引用。
为什么移动后 b 的值发生变化?而字符串 f 没有变化?
引用 Remy 来自 https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary 的回答。
"- 一个函数调用中引用参数的临时绑定一直存在到包含该函数调用的完整表达式的末尾:如果函数 returns 是一个引用,它比完整表达式还长,它变成一个悬空的引用。
两个临时对象都在完整表达式结束时被销毁。对于 int&& 和 string&&,此处的行为完全未定义。
#include <iostream>
using namespace std;
int&& a(int&& b) {
cout << b << endl; //output 5
return std::move(b);
}
string&& d(string&& e) {
cout << e << endl; //output abc
return std::move(e);
}
int main() {
// your code goes here
int&& b = a(5);
cout << b<< endl; // output 0
string&& f = d("abc");
cout << f << endl; //output abc
return 0;
}
函数 a 应该 return 对 5 的右值引用。 为什么移动后 b 的值发生变化?而字符串 f 没有变化?
引用 Remy 来自 https://en.cppreference.com/w/cpp/language/reference_initialization#Lifetime_of_a_temporary 的回答。
"- 一个函数调用中引用参数的临时绑定一直存在到包含该函数调用的完整表达式的末尾:如果函数 returns 是一个引用,它比完整表达式还长,它变成一个悬空的引用。
两个临时对象都在完整表达式结束时被销毁。对于 int&& 和 string&&,此处的行为完全未定义。