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)复制;)