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()
函数是一个(微小的)祸害。