Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么const函数返回左值而不是右值?_C++_C++11_Reference_Rvalue_Lvalue - Fatal编程技术网

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

C++ 为什么const函数返回左值而不是右值?,c++,c++11,reference,rvalue,lvalue,C++,C++11,Reference,Rvalue,Lvalue,ff()函数返回一个右值,但当我将函数的返回值更改为const时,它是否返回左值?当我将test ff(){}更改为const test ff(){}时,为什么以下输出将其输出从的“左值引用”更改为的“右值引用” #include <iostream> using namespace std; class test { }; void fun( const test& a) { cout << "lvalue reference"<<endl;

ff()
函数返回一个右值,但当我将函数的返回值更改为
const
时,它是否返回左值?当我将
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());
}     
void fun(test&&a)
是一个引用非常量值的函数
ff
返回一个
const test
常量值。不能将对非常量值的引用绑定到常量值,因为这会违反常量正确性。这就是为什么它会绑定到
void-fun(const-test&a)
,它引用了
const-test


请注意,当按值返回时,返回
常量对象
而不是
对象
没有任何好处。向返回类型添加
const
的唯一时间是通过引用返回时。如果您的成员函数标记为
const
或返回对常量数据成员的引用,则必须使用
const
来保持常量的正确性。

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



请注意,当按值返回时,返回
常量对象
而不是
对象
没有任何好处。向返回类型添加
const
的唯一时间是通过引用返回时。如果您的成员函数标记为
const
或返回对常量数据成员的引用,则必须使用
const
来保持const的正确性。

您的测试函数输出具有误导性,测试函数应改为:

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;
}
void-fun(常量测试&a)
{

cout您的测试函数输出具有误导性,测试函数应改为:

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;
}
void-fun(常量测试&a)
{

cout在这种情况下,如果您对编译器为什么选择一个重载而不是另一个重载感兴趣,通常最容易(或多或少)直接询问编译器它是如何/为什么做出这样的决定的,只允许它选择另一个函数,并查看它给出了什么错误消息(或者它是否可能根本没有给出错误消息).在这种情况下,我们可以删除使用常量左值引用的函数,以获得如下代码:

#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());
}

这不像标准中直接引用的那样权威,但编译器在这方面做得足够好,因此错误消息可以提供相当多的信息。

在这种情况下,如果您对编译器为什么选择一个重载而不是另一个重载感兴趣,通常最容易(或多或少)理解通过只允许编译器选择另一个函数,并查看它给出了什么错误消息(或者它是否可能根本不给出错误消息),直接询问编译器是如何/为什么做出这样的决定的。在这种情况下,我们可以删除使用常量左值引用的函数,以获得如下代码:

#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());
}

这不是标准的直接引用,但是编译器在这样的情况下是足够好的,错误消息可以是相当翔实的。

C++不能隐式删除const。C++不能隐式删除const。我认为它有了很大的改进。@ YAK AdNeNvraMunt感谢您的反馈。欢迎您。更新;
const-value-foo()
函数是一个(微小的)祸害。我认为它有了很大的改进。@Yakk-AdamNevraumont感谢您的反馈。谢谢更新;
const-value-foo()
函数是一个(微小的)祸害。