这可能已经被问过了。
为什么允许将引用到 const 分配给非常量变量?
为什么允许这样做
int mut {0};
const int & r_to_c {mut};
mut = 1;
// now r_to_c changed to 1!
// But it was supposed to be a reference to something constant!
?当然,我不能改变引用到常量本身的值。我不能
r_to_c = 2;
但不是 const
资格执行太少?我希望,从 const-ness 的 promise 来看,绑定(bind)到可变变量是不允许的。否则保证是
const
给我?他们看起来很虚弱,而且这似乎很容易欺骗程序员自爆。我知道 C++ 以允许人们在他们的脚上开枪而闻名。允许危险的事情我没有问题。在这种情况下,我的问题是,鉴于
const
的语义,在这种情况下,它似乎是故意欺骗的。这里不是人们所期望的。我的问题是关于编译器和语言语义,而不是具体的引用(我可以使用分配给非常量变量地址的指向 const 的指针问同样的问题。像
int mut{0}; const int * p_to_c{&mut};
) .为什么引用到常量(或指针到常量)的语义只是“你不能使用这个特定的窗口来修改你看到的东西(但是如果你有其他非常量的窗口,你可以修改它)”而不是更强大的“这只能是一个窗口,可以看到被声明为常量并且编译器保证它保持不变的东西”?
[关于术语的注释:我使用表达式“reference-to-const”而不是“const reference”,因为“const reference”,解释为
T& const
- 始终调用 T* const
“常量指针”-,不存在。]
最佳答案
but isn't the const qualification enforcing too little? I would expect, from a promise of const-ness, that binding to mutable variables was disallowed.
不,这不是“太少”。你在期待错误的事情。
首先,是否绑定(bind) const 引用并不会使对象本身
const
.那会很奇怪:void foo(int& x) {
static const int& y = x;
}
当我调用 foo
:int x = 42;
foo(x);
我不知道其他人是否会保留 const
引用我的非常量 x
.Otherwise what guarantees is const giving me?
您不能通过
const
修改某些内容引用:void bar(const int& x);
int x = 0;
bar(x);
当我调用一个接受 const&
的函数时然后我知道它不会修改我的(非常量)参数。如果 const 引用不会绑定(bind)到非 const 对象,那么将无法使最后一个示例工作,即您只能将非 const 对象传递给修改它们的函数,但不能传递给不修改它们的函数。附言我能理解你的困惑。有时会忽略,持有一个常量引用并不意味着该对象不能被修改。考虑这个例子:
#include <cstddef>
#include <iostream>
struct foo {
const int& x;
};
int main() {
int y = 0;
foo f{x};
std::cout << f.x; // prints 0
y = 42;
std::cout << f.x; // prints 42
}
将成员的值打印到屏幕上会产生两种不同的结果,即使 foo::x
是一个恒定的引用!它是“常量引用”而不是“对常量的引用”。什么const
这里的实际意思是:你不能修改y
通过f.x
.
关于c++ - 关于引用到常量(和指针到常量)的弱语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65748634/