const&指的是非易失性变量.变量发生了变化.更改是否使const&?无效?

thb*_*thb 1 c++ const reference undefined-behavior const-reference

在C++中,可以const &改变的价值吗?

好吧,当然不能改变,可以吗?这const意味着什么.而且,听听Stroustrup:

const左值参考指的是恒定的,这是从视角的参照的用户的点不可变的.

但是这个怎么样?

#include <iostream>

int main() {
    int           a = 0;
    const int&    r = a;
    const int old_r = r;
    ++a;
    const int new_r = r;
    std::cout
      <<      "old_r == " << old_r
      << " but new_r == " << new_r << std::endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

在我的机器上,这输出,old_r == 0 but new_r == 1.

这是我真正的问题.在上面的代码中,查看该行

    const int new_r = r;
Run Code Online (Sandbox Code Playgroud)

只要

  • 地址&new_r既不在此行也不在代码的其他地方提取
  • 代码什么都没有volatile,

没有任何东西阻止优化编译器从合并old_rnew_r成一个单一的固定的对象,处理该行,虽然它内容如下?

    const int& new_r = old_r;
Run Code Online (Sandbox Code Playgroud)

我问,因为据我所知,如果编译器做了这样的优化,那可能会改变行为.该程序可能输出,old_r == 0 but new_r == 0.

相关问题

我找到的最接近相关的现有问题是这一个:

以下也是相关的,但与目前的问题不同,涉及演员:

另见N4659(草案C++ 17标准),第二节.10.1.7.1, "在CV-预选赛. "

问题顶部的Stroustrup的引用来自教派."C++编程语言"的第7.7.2节,第4版.当然,没有作者可以在一本千页的书中完美地写出每一个句子; 但也许Stroustrup很清楚,我只是读错了.不过,你可能会看到为什么句子让我感到困惑.这就是我问过的原因.

Nat*_*ica 9

在C++中,const&value的值可以改变吗?

是的,这是完全合法的.取一个const&变量并不能阻止该变量被修改,它只是意味着你不能通过引用修改变量.这意味着

int a = 42;
int const& b = a;
++a;
std::cout << a << " " << b;
Run Code Online (Sandbox Code Playgroud)

将打印

43 43
Run Code Online (Sandbox Code Playgroud)

我试过做

++b;
Run Code Online (Sandbox Code Playgroud)

虽然这将是一个编译器错误作为b"的值的访问是const++是一个非const的操作.


归档时间:

查看次数:

120 次

最近记录:

6 年,9 月 前