常量 & 指非易失性变量。变量将更改。更改是否使常量 & 无效?

A const & refers to a nonvolatile variable. The variable changes. Does the change invalidate the const &?

本文关键字:常量 变量 无效 是否 易失性      更新时间:2023-10-16

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

好吧,当然无法改变,可以吗?这就是const的意思。此外,听stroustrup:

a const lvalue参考是指常数,从参考用户的角度来看,它是不变的。

但是这个呢?

#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

相关问题

我发现的最接近相关的现有问题是:

  • (c语言)可以更改const?(请参阅尤其是链接的问题的点编号1。)

以下内容也相关,但与当前的问题不同,涉及演员:

  • 更改const的值
  • 在同一内存地址处的两个不同值
  • 修改常数对象
  • 更改const变量的值[重复]
  • (c语言)通过const声明访问非con
  • (c语言)我们可以修改const变量的值吗?
  • (c语言)const变量值通过使用指针
  • 更改
  • (c语言)关于使用指针修改const变量的混乱
  • (c语言)const_cast [重复]的怪异行为

另请参见N4659(草稿C 17标准),第10.1.7.1.1.1.1.1.1.1.7.1," cv-qualifiers。"

问题顶部的stroustrup的报价来自 c 编程语言的7.7.2, 4th ed。当然,没有作者能在一千页的书中完美地写下每个句子。但是也许斯特鲁斯特鲁普很清楚,我只是读错了他。但是,您可能会明白为什么句子使我感到困惑。这就是为什么我问。

在C 中,可以&amp;更改?

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

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

将打印

43 43

我是否尝试过

++b;

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

在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规则允许编译器优化可见的副作用,
这是不是此处的情况。因此,您的代码中无法完成您的"变量合并"。

好吧,当然无法改变,可以吗?这就是const的含义。

不,不是。

const表示 you 无法更改事物。这并不意味着它不会改变。这并不意味着它是一个常数。

const只是为您提供了一件东西的视图。可能还有其他观点,这些观点可能是可变的。

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

是:其中一个人将具有错误的价值。

是的,const值可以更改。当你做

const int&    r = a;

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

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

您应该与constexpr进行比较,这是真正恒定表达式。