小编Ron*_*ang的帖子

返回一个本地对象右值引用,对还是错?

我看到一旦返回一个本地对象,编译器将采取返回值优化.(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)

我知道返回本地对象的左值引用总是错误的.那么,返回一个本地对象的右值引用也是错误的?

c++ c++11

14
推荐指数
1
解决办法
3073
查看次数

为什么将表达式转换为rvalue对函数的引用是lvalue?

在这里,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

c++ c++11

5
推荐指数
1
解决办法
635
查看次数

标签 统计

c++ ×2

c++11 ×2