【问题标题】:"A reference may be bound only to an object", why is "const int &ref = 3;" valid?“引用可能只绑定到一个对象”,为什么是“const int &ref = 3;”有效的?
【发布时间】:2013-12-07 15:48:51
【问题描述】:

我刚开始学习 C++。我在网上找到了一个建议:“用一本好书学习,它比youtube上的视频更好。”因此,当我有动力并且有时间学习 c++ Primer 5th Ed。

在这本书中,他们说: 注意:“引用不是对象。相反,引用只是已存在对象的另一个名称。”

和: “引用只能绑定到一个对象,而不是文字或更通用表达式的结果”

我明白了:

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

那我就不明白为什么了:

const int &ri3 = 2;  // is valid

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

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

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

感谢您的帮助。

【问题讨论】:

  • 2 是您无法更改的文字。 const 确保引用指向 const 实体,因此您无法更改通过引用引用的对象。
  • "a reference may be bound only to an object, not to a literal or to the result of a more general expression" 仅在某些情况下为真。

标签: c++ reference initialization constants


【解决方案1】:

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

您不能将文字绑定到对非常量的引用(因为 修改文字的值不是使 感觉)。但是,您可以将文字绑定到对 const 的引用。

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

“常量”很重要。第一行是错误和代码 使用此对非常量的引用将无法进行可移植编译,因为 f() 返回一个临时对象(即右值),并且只能是左值 绑定到对非常量的引用。

出于说明目的,请参阅answer

非常量引用不能指向文字。

以下代码会产生错误。

错误:类型的非常量引用的无效初始化 来自“double”类型的右值的“double&”

#include <iostream>

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

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

这是Lightness'的评论。

[C++11: 5.1.1/1]: [..] 字符串字面量是左值;所有其他 文字是纯右值。

还有cppreference(向下滚动到rvalue (until C++11) / prvalue (since C++11)):

prvalue(“纯”右值)是一个表达式,用于标识临时 对象(或其子对象)或者是不与任何对象关联的值 对象。

以下表达式是纯右值:

Literal (except string literal), such as 42 or true or nullptr.

【讨论】:

  • [C++11: 5.1.1/1]: [..] A string literal is an lvalue; all other literals are prvalues.
【解决方案2】:

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

【讨论】:

  • const 和“常量”是两个不同的东西。考虑const int r = rand();
  • @KeithThompson:是的,那又怎样?文字是常量,这就是为什么 cont 引用可以接受它。我没有说它反向有效。
  • 你的结论恰好是正确的,但它并没有从你的前提出发。很明显为什么int &amp;ri3 = 2;(没有const)是无效的,但这并不意味着const int &amp;ri3 = 2; 是有效的。据我了解,编译器必须创建一个隐式只读对象,以便 ri3 可以引用它;请注意,&amp;ri3 会生成一个有效地址。为此必须有一个特殊的语言规则。就此而言,很容易有一个特殊规则使int &amp;ri3 = 2; 有效;只是碰巧没有。
猜你喜欢
  • 2018-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 2021-12-02
  • 2021-12-25
  • 2014-09-21
  • 1970-01-01
相关资源
最近更新 更多