我看到一旦返回一个本地对象,编译器将采取返回值优化.(RVO,NRVO).
标准祝福RVO的部分接着说,如果满足RVO的条件,但编译器选择不执行复制省略,则返回的对象必须被视为右值.
所以我们只写这样的代码:
Widget makeWidget()
{
Widget w;
…
return w;//never use std::move(w);
}
Run Code Online (Sandbox Code Playgroud)
我从来没有看到有人写这样的代码:
Widget&& makeWidget()
{
Widget w;
…
return std::move(w);
}
Run Code Online (Sandbox Code Playgroud)
我知道返回本地对象的左值引用总是错误的.那么,返回一个本地对象的右值引用也是错误的?
在这里,cppreference-lvalue,我发现了
将表达式转换为对函数的rvalue引用是lvalue.
我很好奇,所以我进行了以下实验:
#include <iostream>
using namespace std;
typedef void (&&funr) (int);
typedef void (&funl) (int);
void test(int num){
cout<<num<<endl;//output:20
}
void foo(funr fun){
fun(10);
}
void foo(funl fun){
fun(20);//call this
}
template <typename T> void foo(T&& fun){
cout<<is_same<T,void(&)(int)>::value<<endl;//true, it is lvalue.
cout<<is_same<T,void(int)>::value<<endl;//false, it isn't rvalue.
}
int main()
{
foo(static_cast<void(&&)(int)>(test));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这样的事实.
为什么将表达式转换为rvalue对函数的引用是lvalue?是因为函数类型不需要移动语义或其他东西吗?或者我理解这个词错了.
将表达式转换为对函数的rvalue引用是lvalue