为什么我可以在C ++中为文字值分配现有引用?

时间:2009-01-11 02:31:32

标签: c++ reference initialization variable-assignment literals

请考虑以下事项:

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)中的练习,这个问题是关于引用初始化。尽管如此,首先完全忽略了参考点是非常尴尬的。 :)

3 个答案:

答案 0 :(得分:6)

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

答案 1 :(得分:6)

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

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

答案 2 :(得分:4)

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

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

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

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

哇哇哇哇? :)