常量引用 - C++

3

我对C++中const引用的概念有疑问。

int i =10;   
const int &j = i;  
cout<<"i="<<i<<" j:"<<j; // prints i:10 j:10

i = 20;
cout<<"i="<<i<<" j:"<<j;  // prints i:20 j:10 

为什么第二个j语句没有打印出新值,即20

如果任何变量的引用表示它们之间的强关联,那么这是如何可能的呢?


在gcc 4.5.2上打印20 20,你使用的编译器是什么? - Torp
那是错误的。http://ideone.com/IATb1 你使用的编译器是什么? - Benjamin Lindley
你用哪个编译器试过这段代码?这不应该是正确的,正如预期的那样,我无法在Visual Studio 2008中重现它。 - André Caron
这是唯一的代码吗?还是你从更大的上下文中剪切出来的?如果是这样的话:在更大的上下文中,你的变量是否被本地变量所遮蔽了? - Nobody moving away from SE
1
我无法想象一个编译器会犯如此微不足道的错误。 - GManNickG
4个回答

6
那是编译器的错误。代码应该打印出 20 20

4
我不会称之为编译器bug,因为它非常基础,是完全的失败。同时也因为它完全违反了规格说明。 - Nobody moving away from SE
如果代码完全与规格相矛盾,那么这不是一个 bug 吗? - jalf
3
现在称之为 bug 还为时过早,目前还没有一段能够复现这种情况的代码。更有可能的是,以上所提到的是用户出错了,并且他们已经剪裁掉了相关的上下文片段,这使得我们无法诊断他们的错误。 - Martin York

4

我不明白为什么在第二个coutj不会输出20

我运行了这段代码:

int main() {
        int i =10;   
        const int &j = i;  
        cout<<"i="<<i<<" j:"<<j << endl; // prints i:10 j:10

        i = 20;
        cout<<"i="<<i<<" j:"<<j << endl;  // prints i:20 j:10 
        return 0;
}

然后它给了我这个输出:

i=10 j:10
i=20 j:20

请看在线演示: http://ideone.com/ELbNa

这意味着,要么你正在使用的编译器有bug(这不太可能,因为这是C++最基本的东西),要么是你没有正确查看输出结果(这更可能是情况)。


3
const引用表示它无法更改参照的值。但是,所引用的对象可以更改其值,这反过来会影响引用本身。我不知道你为什么会得到你显示的输出结果。 实际上进行更改并在此处查看输出。

0

在这里补充一点,const 引用不需要 lvalue 来初始化。例如:

int &r = 10;            //ERROR: lvalue required
const int &cr = 10;     //OK

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接