常量 & 指非易失性变量。变量将更改。更改是否使常量 & 无效?
A const & refers to a nonvolatile variable. The variable changes. Does the change invalidate the const &?
在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_r
和new_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
进行比较,这是真正恒定表达式。
- 通过多个头文件使用常量变量
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 非常量变量只读位置的赋值
- 使用大量已知常量变量的正确方法
- 无法在具有常量变量大小的类中创建堆栈分配数组
- 这些语句是否等效(静态变量、常量变量和泛型)
- 包含常量变量并包含在多个文件中的标头的链接错误
- 我们如何修改常量变量的值
- 如何在模板类中设置静态常量变量
- 为什么常量变量是模板特殊化所必需的,而不是常量
- 如何在函数中传递常量变量?
- 定义常量变量的最佳方法
- C++ 声明常量变量,但推迟其初始化?
- 如何初始化具有常量变量的结构数组
- 使用常量变量作为维度将矩阵声明为类成员时出现编译器错误
- 使用指针 c++ 更改常量变量
- c++ 类中的静态常量变量和常量变量在存储方面是否有区别
- 为什么 lambda 对象中的局部变量是常量变量?
- 使用常量变量作为数组的大小
- 为许多类可能需要的所有常量变量制作独立的头文件是否是一种很好的做法?