【问题标题】:Const references - C++常量引用 - C++
【发布时间】:2011-08-07 16:31:01
【问题描述】:

我对 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,你使用的是什么编译器?
  • 那是错误的。 ideone.com/IATb1你用的是什么编译器。
  • 你用什么编译器来测试这段代码?这不应该是正确的,而且正如预期的那样,我无法使用 Visual Studio 2008 重现它。
  • 它是唯一的代码还是你把它从更大的上下文中删掉了?如果是这样:是不是在更大的上下文中,您的变量之一被局部变量遮蔽了?
  • 我无法想象有一个编译器会犯如此微不足道的错误。

标签: c++ reference constants


【解决方案1】:

这是一个编译器错误。代码应该打印20 20

【讨论】:

  • 我不会将其称为编译器错误,因为它是如此基本以至于完全失败。也因为它完全违背了规范。
  • 所以如果它完全违背规范就不是错误?
  • 现在称这是一个错误还为时过早,目前还没有一段代码可以重现这种影响。以上很可能是用户错误,他们已经剪掉了相关的上下文,以便我们诊断他们的错误。
【解决方案2】:

我看不出j 不会在第二个cout 中打印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

这意味着,您正在使用的编译器有错误(这种情况不太可能,因为它是 C++ 中最基本的东西),或者您没有正确看到输出(很可能是这种情况)。

【讨论】:

    【解决方案3】:

    const reference 表示它不能改变引用的值。但是,referrant 可以更改它的值,这反过来会影响引用。我不知道你为什么得到你显示的输出。

    It actually changes and see the output here.

    【讨论】:

      【解决方案4】:

      在这里再补充一点,const 引用不需要左值来初始化它。例如

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

      【讨论】:

        猜你喜欢
        • 2014-03-30
        • 2011-05-07
        • 1970-01-01
        • 2014-03-13
        • 2011-05-31
        • 2019-02-05
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多