为什么const函数返回左值而不是右值?

时间:2018-09-13 15:22:08

标签: c++ c++11 reference rvalue lvalue

ff()函数返回一个右值,但是当我将函数的返回值更改为const时,它返回左值吗?当我将"lvalue reference"更改为"rvalue reference"

时,以下输出为什么将其输出从test ff() { }更改为const test ff() { }
#include <iostream>
using namespace std;
class test { };
void fun( const test& a)
{
    cout << "lvalue reference"<<endl;
}
void fun(  test&& a)
{
    cout << "rvalue reference"<<endl;
}
const test ff() { } // <<---return value is const now
int main()
{

  fun(ff());
}     

输出:

lvalue reference

2 个答案:

答案 0 :(得分:9)

void fun( test&& a)是一个引用非常量右值的函数。 ff返回const test,它是一个常量值。您不能将对非const右值的引用绑定到const右值,因为这会违反const正确性。这就是为什么它绑定到void fun( const test& a)的原因,后者引用了const test


请注意,按值返回时,返回const thing而不是thing没有好处。只有在通过引用返回时,才将const添加到返回类型很重要。如果您具有标记为const的成员函数或返回对常量数据成员的引用,则必须使用const来保持const正确性。

答案 1 :(得分:2)

您的测试功能输出具有误导性,应改为使用测试功能:

void fun( const test& a)
{
    cout << "lvalue const reference"<<endl;
}
void fun( test& a)
{
    cout << "lvalue reference"<<endl;
}
void fun(  test&& a)
{
    cout << "rvalue reference"<<endl;
}
void fun( const test&& a)
{
    cout << "rvalue const reference"<<endl;
}

然后您将看到那里真正发生的事情。