在C++中,const &的值会改变吗?
当然,它不能改变,是吗?这就是const的意思。此外,听Stroustrup:
constlvalue引用是指一个常量,从引用的用户的角度来看,常量是不可变的。
但是这个呢?
#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_r和new_r合并到一个常量对象中,将该行视为如下所示?
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节。当然,没有一位作家能在一本一千页的书中完美地写出每句话;然而,也许斯特劳斯鲁普是清楚的,我只是把他读错了。尽管如此,你可能会明白为什么这句话让我感到困惑。这就是为什么我要问。
发布于 2019-02-21 16:12:36
在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规则允许编译器在可见副作用相同时进行优化,
这是,而不是,这里的情况。因此,您的代码中的“提议的变量合并”无法幸运地完成。
发布于 2019-02-21 16:06:37
在C++中,const和const的值会改变吗?
是的,这完全合法。带一个const&到某个变量并不能阻止这个变量被修改,它只是意味着你不能通过引用修改这个变量。这意味着
int a = 42;
int const& b = a;
++a;
std::cout << a << " " << b;将打印
43 43如果我想做
++b;尽管这将是一个编译器错误,因为b对值的访问是const,而++是一个非const操作。
发布于 2019-02-21 16:10:07
当然,它不能改变,是吗?这就是康斯特的意思。
不,它不是。
const意味着你不能改变这件事。这并不意味着它不会改变。这并不意味着它是一个常数。
const只是给出了一个不可变的事物视图。对这件事可能有其他的看法,而这些观点可能是可变的。
是否有任何阻止优化编译器将old_r和new_r合并为单个常量对象的操作?
是的:事实上他们中的一个会有错误的价值。
https://stackoverflow.com/questions/54811374
复制相似问题