首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >const &指非易失变量。变量发生了变化。更改是否使const &?

const &指非易失变量。变量发生了变化。更改是否使const &?
EN

Stack Overflow用户
提问于 2019-02-21 16:03:53
回答 4查看 222关注 0票数 1

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

当然,它不能改变,是吗?这就是const的意思。此外,听Stroustrup:

const lvalue引用是指一个常量,从引用的用户的角度来看,常量是不可变的。

但是这个呢?

代码语言:javascript
复制
#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

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

代码语言:javascript
复制
    const int new_r = r;

范围内

  • 地址&new_r既不在这一行中提取,也不在代码的其他地方提取,并且
  • 代码中没有volatile

是否有任何东西阻止优化编译器将old_rnew_r合并到一个常量对象中,将该行视为如下所示?

代码语言:javascript
复制
    const int& new_r = old_r;

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

相关问题

我发现目前最相关的问题是:

以下内容也是相关的,但与本问题不同的是,涉及类型:

另见N4659 (草案C++17标准),第10.1.7.1节,“cv-限定符”。

问题顶部的Stroustrup引文来自C++编程语言第4版的第7.7.2节。当然,没有一位作家能在一本一千页的书中完美地写出每句话;然而,也许斯特劳斯鲁普是清楚的,我只是把他读错了。尽管如此,你可能会明白为什么这句话让我感到困惑。这就是为什么我要问。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-02-21 16:12:36

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

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

代码语言:javascript
复制
void foo(const int& c, int& mut) {
    std::cout << c << " ";
    ++mut; // changes `c` if &c == &mut
    std::cout << c << std::endl;
}

代码语言:javascript
复制
int a = 42;
foo(a, a); // 42 43

是否有任何东西阻止优化编译器将old_r和new_r合并到一个常量对象中,将该行视为如下所示?

as-if规则允许编译器在可见副作用相同时进行优化,

这是,而不是,这里的情况。因此,您的代码中的“提议的变量合并”无法幸运地完成。

票数 4
EN

Stack Overflow用户

发布于 2019-02-21 16:06:37

在C++中,const和const的值会改变吗?

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

代码语言:javascript
复制
int a = 42;
int const& b = a;
++a;
std::cout << a << " " << b;

将打印

代码语言:javascript
复制
43 43

如果我想做

代码语言:javascript
复制
++b;

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

票数 9
EN

Stack Overflow用户

发布于 2019-02-21 16:10:07

当然,它不能改变,是吗?这就是康斯特的意思。

不,它不是。

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

const只是给出了一个不可变的事物视图。对这件事可能有其他的看法,而这些观点可能是可变的。

是否有任何阻止优化编译器将old_r和new_r合并为单个常量对象的操作?

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

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54811374

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档