[英]Why is it allowed to pass R-Values by const reference but not by normal reference?
下面的程序
void display(const int& a)
{
cout << a ;
}
如果使用这样的文字调用将起作用
display(5);
但没有const
它就行不通。
那么const
引用如何保持指向 R 值(匿名变量)呢?
对于你的最后一个问题:
const 引用如何保持指向 R 值(匿名变量)
这是答案。 C++ 语言说局部常量引用会延长临时值的生命周期,直到包含范围结束,但可以节省复制构造的成本(即,如果您要使用局部变量)。
认为任何对象作为含一些值内和盒可以或可以不具有名称标签,即具有名称标记为盒框的variable
和没有姓名标签作为框literal
。 无论是否有名牌,我们都有盒子。
Reference
是我们将名称标签添加到我们的盒子的方式。
int a = 5;
int &b = a;
我们的盒子有两个名称标签(里面的值为5
)。
const int &c = 5;
你在那里,这个盒子刚刚命名。
以前从未有过名称的框的新名称必须标记为const
。 因为框内的值可以通过其名称进行更改,我们不希望它发生(不允许发生)到我们的literal
框。
它回到文字的定义。 文字是常数; 例如,数字 5 的值永远不会改变,尽管变量可能会从被分配的值 5 更改为另一个值。 通过引用传递文字意味着该函数可能会修改它,根据定义,这是您无法对文字执行的操作,这就是语言要求您使用 const 修改它的原因。 我不认为 C++ 可以修改文字,即使它让您尝试,但它仍然强制执行此约定以提醒程序员不能修改文字值。
因为文字是常数。 1 不能变成 2, "abd"
不能变成"edf"
。
如果 C++ 允许您通过非const
引用获取文字,那么它将:
(1) 会在你的程序中造成混乱,因为x == 1
可能意味着“x 等于 2”取决于上下文,并且 (2) 是不可能实现的,因为void display(int& a)
应该如何知道它是否收到字面引用?
由于这两个选项都没有意义,因此只能通过const
引用传递文字。
实际上,不推荐使用的从字符串文字到char*
转换是一个很好的例子,说明了为什么规则很有意义,尽管它不是引用而是指针。 您可以让char*
指向"abc"
,但尝试实际利用char*
的“可修改性”属性并修改char
元素之一会导致未定义的行为。 这使得整个弃用的转换既危险又无用(在非遗留代码中)。
你不想在语言的所有其他部分都遇到这样的麻烦,是吗?
r 值是一个临时的消逝对象,可以读取但即将被销毁。 它也是一个不能留在赋值左侧的值(你怎么能理解为这样的幽灵赋值?)
C++ 有一种非常特殊的方式来处理这种实体。 如果您可以通过(非常量)引用传递 r 值,您也可以从函数内部分配给它。 因此,如果 r 值通过引用传递,则必须是常量引用。
但这并不是全部事实,因为您确实有 r 值引用(用&&
表示)。 因此,您最终可以操作临时对象,但是您必须使用 r 值引用明确声明您确实想要这样做。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.