繁体   English   中英

为什么允许通过常量引用而不是通过普通引用传递 R 值?

[英]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. 必须允许文字动态改变它们的含义,让你可以让 1 变成 2。
  2. 期望程序员特别注意仅通过那些不引用文字的引用来修改值,并在错误时调用未定义的行为。

(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM