-2

考虑以下:

int ival = 1.01;
int &rval = 1.01; // error: non-const reference to a const value.
int &rval = ival;

rval = 1.01;

&rval 对文字值的第一次分配按预期失败。如果我注释掉该行,代码将编译并运行。我理解为什么初始化失败,但我很困惑为什么对 rval 的分配在最后一行起作用。我认为不允许分配对文字值的引用。

编辑:感谢您的快速回答。我很想删除它以掩饰我的耻辱,但我想我会把它留在这里,以便其他人可以指点和笑。

在我自己的辩护中,我正在完成一本书(C++ Primer)中的练习,这个问题是关于引用初始化的。尽管如此,一开始就完全忽视了参考的意义,这还是很尴尬的。:)

4

3 回答 3

6

ival不是文字值,1.01是文字值。它被复制到ivalwhich 是一个变量,它肯定可以将它的引用分配给另一个变量。

于 2009-01-11T02:35:27.073 回答
6

初始化引用后,它是初始化对象的别名。初始化引用后,您无法更改引用所指的内容。但是,您可以更改引用所指的“事物”(如果引用不是const)。

最后一行实际上将变量设置ival为 1.01(再次)。

于 2009-01-11T02:35:41.457 回答
4

您可能会惊讶地发现您可以执行以下操作:

const int& x = 42;        // No error!

C++ 确实允许使用文字值(或其他右值)初始化const引用。实际发生的是编译器通过复制 RHS 创建一个临时文件,并初始化引用以引用该临时文件。编译器确保临时变量在范围退出之前保持活动状态(即x,在这种情况下,只要超出范围)。

请注意,这在初始化类的成员变量时不起作用。

棘手吧?:)

于 2009-01-11T04:56:48.817 回答