首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >“引用只能绑定到一个对象”,为什么"const &ref = 3;“有效?

“引用只能绑定到一个对象”,为什么"const &ref = 3;“有效?
EN

Stack Overflow用户
提问于 2013-12-07 15:48:51
回答 2查看 211关注 0票数 1

我才刚开始学习c++。我在网上找到了一条建议:“用一本好书学习,比youtube上的视频更好。”因此,当我有动力,我有时间学习与c++初级第五版。

在这本书中,他们说:“引用不是一个对象,而是一个已经存在的对象的另一个名称。”

并且:“引用只能绑定到对象,而不能绑定到文字或更一般表达式的结果。”

我明白:

代码语言:javascript
代码运行次数:0
运行
复制
int i = 3;
int &ri = i;  // is valid: ri is a new name for i
int &ri2 = 2;  // is not valid: 2 is not an object

那我就不明白为什么:

代码语言:javascript
代码运行次数:0
运行
复制
const int &ri3 = 2;  // is valid

他们写道:“如果你从右到左阅读复杂的指针或引用声明,就更容易理解了。”

好吧,这不是很复杂。我理解:我声明了一个名为ri3的变量,它是对int类型对象的引用(在类型之后的引用,在表达式中的地址),它是一个常量。

我想它已经被解释过很多次了,但是当我在论坛上搜索时,我发现复杂问题的答案(对我来说)很复杂,我仍然不明白。

谢谢你的帮助。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-07 15:58:34

https://stackoverflow.com/a/7701261/1508519

不能将文本绑定到对非const的引用(因为修改文本的值不是一个有意义的操作)。但是,可以将文字绑定到对const的引用。

http://herbsutter.com/2008/01/01/gotw-88-a-candidate-for-the-most-important-const/

"const“很重要。第一行是一个错误,代码不能用这个对非const的引用进行可移植编译,因为f()返回一个临时对象(即rvalue),并且只能将lvalue绑定到非const引用。

为了说明起见,请参阅此回答

非const引用不能指向文字。

以下代码将产生错误。

错误:从“double”类型的rvalue中初始化“double&”类型的非连续引用无效

代码语言:javascript
代码运行次数:0
运行
复制
#include <iostream>

double foo(double & x) {
    x = 1;
}

int main () {
    foo(5.0);
    return 0;
}

以下是轻盈的评论。

C++11: 5.1.1/1:.字符串文字是一个lvalue;所有其他文字都是prvalue。

优先选择 (向下滚动到rvalue (until C++11) / prvalue (since C++11)):

prvalue (“纯”rvalue)是标识临时对象(或其子对象)的表达式,或者是与任何对象无关的值。 以下表达式为prvalue: 文字(字符串文字除外),如42或true或nullptr。

票数 3
EN

Stack Overflow用户

发布于 2013-12-07 15:52:06

它是有效的,因为数字文字实际上是常量。所以编译器只有当它是const时才能接受这样的引用。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20443262

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档