C++ C+中的引用初始化+;
有谁能向我解释一下这两种说法之间的区别吗C++ C+中的引用初始化+;,c++,reference,lvalue,rvalue,const-reference,C++,Reference,Lvalue,Rvalue,Const Reference,有谁能向我解释一下这两种说法之间的区别吗 class A{}; const A& a = A(); // correct A& b = A(); // wrong 上面说 从类型为AA的临时文件初始化类型为A&的非常量引用无效 为什么常量在这里很重要?对于临时/r值,只能使用常量引用 可以对非临时/左值进行非常量引用 A a; A& b = a; 我相信为什么要加强一个值是暂时的事实,因为在修改一个即将消失的东西时没有
class A{};
const A& a = A(); // correct
A& b = A(); // wrong
上面说
从类型为A
A的临时文件初始化类型为A&
的非常量引用无效
为什么常量在这里很重要?对于临时/r值,只能使用常量引用 可以对非临时/左值进行非常量引用
A a;
A& b = a;
我相信为什么要加强一个值是暂时的事实,因为在修改一个即将消失的东西时没有什么价值。在C++语言中,将非const引用附加到一个值是非法的,而将一个常量引用附加到一个值是完全可以的。例如,这是合法的
const int& r = 5;
虽然这不是
int &r = 5; // ERROR
表达式
A()
返回的A
类型的临时对象是右值,因此上述规则也适用于您的情况。非常量引用必须用l值初始化。如果你可以用临时表来初始化它们,那么下面会怎么做
int& foo = 5;
foo = 6; // ?!
const
引用具有延长仲裁人寿命的特殊属性,并且由于它们是const
,因此不可能尝试修改内存中没有的内容。例如:
const int& foo = 5;
foo = 6; // not allowed, because foo is const.
记住,引用实际上必须引用某些东西,而不仅仅是临时变量。例如,以下内容是有效的:
int foo = 5;
int& bar = foo;
bar = 6;
assert(foo == 6);
这方面的术语有点混乱;你可能想进一步研究它们。以下是简短的答案: 将临时对象(调用类的构造函数的结果)分配给变量。临时对象是一个R值。不能将R值分配给非常量引用
允许您为常量引用指定一个R值,尽管允许该值的理由相当模糊。因为标准中这样说: §8.5.3.5。。。否则,该引用应为对非易失性常量类型的左值引用 但是,如果您非常想要它,您可以:
#include <iostream>
int main()
{
const int & cr=5;
int & r=const_cast<int &>(cr);
r=6;
std::cout<<r;
}
// outputs 6 with c++/clang++, Debian 8, amd64
#包括
int main()
{
常数int&cr=5;
int&r=常数(cr);
r=6;
std::coutGranted;我认为OP正在寻找这种情况的原因。右值是一个未命名的临时值,类似于函数的返回值。@简洁:不一定。例如,枚举常量是右值,但它已命名。等等,这是否意味着我可以使用常量classA&ref=ReturnsClassByValue()
?我以为temp会在下一行消失。是的,你可以使用它。临时变量的持续时间与引用变量的持续时间一样长:是的,常量引用将临时变量的寿命延长到引用的寿命。在许多方面,你可以认为常量T&
是常量T
——只是没有花费(e)复制;)