2016-03-19 37 views
3

正如标题所说,为什么允许它通过一定的基准,但不正常的引用传递的R值(文字)为什么它可以通过const引用传递R值而不是正常引用?

void display(const int& a) 
{ 
cout << a ; 
} 

会工作,如果叫display(5)但没有const它不会工作**** **我的意思是const引用如何保持指向一个R值(匿名变量)******

+0

如果你改变'a',你会发生什么? –

+0

什么?请解释我不是那种有天赋的 –

+0

如果你不使用'const',那么你就是说你可能会改变'a'引用的内容,但是如果它引用一个字面值,那该如何工作呢? –

回答

4

为了您的最后一个问题:

const引用如何能保持指向一个R值(匿名变量)

Here is the answer。 C++语言表示,本地const引用延长了临时值的生存期,直到包含范围结束为止,但为您节省了复制构造的成本(即,如果您要使用本地变量)。

+0

可以标记更多而不是一个答案,因为其中的一些答案确实做得很好,谢谢 –

+1

只需选择最好,最完整的答案;不一定是这个。 – Tanz87

+0

我已阅读您的[链接](http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/)。这是非常丰富的。谢谢。 – NERDYLIZARD

2

它返回到文字的定义。文字是一个常数;例如,数字5的值永远不会改变,尽管变量可能会从被指定为5的值改变为另一个值。通过引用传递一个字面意味着该函数可能会修改它,这是你无法对一个文字进行的定义,这就是为什么该语言要求你用const修改它。我不认为C++可以修改文字,即使它允许你尝试,但它仍然强制这个惯例提醒程序员文字值不能被修改。

希望能回答你的问题!

+0

实际上是什么我',问一个常量引用如何保持指向一个具有表达式范围的匿名变量,并且谢谢 –

+0

所以你想知道为什么参考不会失去它所指的内容,因为文字的生命期应该到期之后的表达? – Durendal

+0

这就是我在徘徊 –

1

因为文字是恒定的。 1不能成为2,"abd"不能成为"edf"

如果C++允许你通过非const参考采取文字,那么它要么:

  1. 必须让文字动态地改变自己的意思,让你做1成为2.
  2. 期待程序员要特别小心,只能通过那些不涉及文字的引用来修改值,并且如果你弄错了,就调用未定义的行为。

(1)将在程序中制造混乱,因为x == 1可能意味着“为x等于2”根据上下文,和(2)是不可能实现的,因为void display(int& a)应该如何知道它是否接收一个字面引用或不?

由于这两个选项都不合理,文字只能通过const引用传递。


其实,从字符串文字到char*弃用的转换也是为什么规则做出很大的意义,虽然它不是一个参考,但指向一个很好的例子。您可以让char*指向​​,但尝试实际使用char*的“可修改性”属性并修改其中一个元素会导致未定义的行为。这使得整个弃用的转换既危险又无用(在非遗留代码中)。

你不想在语言的其他部分遇到这样的麻烦,对吗?

+0

其实我什么,问的是如何可以一个恒定的引用保持指向一个具有表达范围的匿名变量,并感谢的 –

3

内部含有一些值的任何对象作为和盒可以或可以不具有名称标记即,盒子名称标签作为variable和盒而不名称标签作为literal的思考。无论名牌是否存在,我们拥有箱子。


Reference是我们的名称标签添加到我们的信箱的方式。

int a = 5; 
int &b = a; 

我们有名称标签我们的盒(带值5内)。

const int &c = 5; 

你在那里,箱子刚刚命名。


从来没有名称的盒子的新名称必须标记为const。因为箱子内的数值可以通过它的名称改变,我们不希望它发生(不允许发生)与我们的literal箱子。

+0

惊人的解释,谢谢从我心底 –

1

r值是一个临时消逝物体,可以读取但即将销毁。它也是一个不能停留在赋值左侧的值(你怎么理解赋值给这样的幽灵?)

C++有一个非常具体的方式来处理这种实体。如果你可以通过(非const)引用传递一个r值,你也可以从函数内部赋值给它。因此,如果要通过引用传递r值,这必须是一个const引用。

尽管这并不是全部的事实,因为你确实有r值参考(用&&表示)。因此,最后,您可以操纵一个临时对象,但是您必须使用r值引用来明确声明您确实想要这样做。

相关问题