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

问题描述 投票:1回答:4

在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;
}

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

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

    const int new_r = r;

只要

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

做什么阻止优化编译器将old_rnew_r合并为一个常量对象,将该行视为如下所示?

    const int& new_r = old_r;

我问,因为据我所知,如果编译器如此优化,可能会改变行为。该程序可能输出,old_r == 0 but new_r == 0

相关问题

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

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

另见N4659(草案C ++ 17标准),sect。 10.1.7.1,“cv-qualifiers”。

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

c++ reference const undefined-behavior const-reference
4个回答
4
投票

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

是的,但不是通过该引用(忽略mutable字段)。

void foo(const int& c, int& mut) {
    std::cout << c << " ";
    ++mut; // changes `c` if &c == &mut
    std::cout << c << std::endl;
}

int a = 42;
foo(a, a); // 42 43

做任何事情阻止优化编译器将old_r和new_r合并为一个常量对象,将该行视为如下所示?

as-if规则允许编译器优化可见的副作用是否相同, 这不是这种情况。因此,幸运的是,您的代码中的“建议的变量合并”无法完成。


9
投票

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

是的,这是完全合法的。将const&取为某个变量并不能阻止该变量被修改,只是意味着您无法通过引用修改变量。这意味着

int a = 42;
int const& b = a;
++a;
std::cout << a << " " << b;

将打印

43 43

我试过做

++b;

虽然这将是一个编译器错误,因为b访问该值是const++是一个非const操作。


4
投票

好吧,当然不能改变,可以吗?这就是const意味着什么。

不,不是。

const意味着你不能改变这件事。这并不意味着它不会改变。这并不意味着它是一个常数。

const只是给你一个不可改变的事物。可能还有其他观点,那些可能是可变的。

做任何事情阻止优化编译器将old_r和new_r合并为一个常量对象

是的:事实上其中一个会有错误的价值。


2
投票

是的,const值可以改变。当你这样做

const int&    r = a;

您正在创建对const int的引用。将不允许使用此变量的代码通过引用更改值。但它绝不表明存储在那里的价值不会改变。

将其视为具有只读权限的变量。其他一些代码可能具有写访问权限。

你应该与constexpr比较,它们是真正的常量表达式。

© www.soinside.com 2019 - 2024. All rights reserved.