c++ - 关于引用到常量(和指针到常量)的弱语义

标签 c++ constants const-reference

这可能已经被问过了。
为什么允许将引用到 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/

相关文章:

c++ - 重新实现 QThread 的 start()

c++ - std::map 使用比较参数检查第一个和第二个值

c++ - 检查数组位置是否为空/空

postgresql - 如何在 Postgresql 中创建列常量

c++ - 是否有任何 C++ 编译器可以对悬空引用发出警告?

c++ - const_reference 或 map 的迭代器(当不实际迭代时)

C++ 如何使用 onClick 事件创建文本框?

c++ - 我是否正确地说 const_cast 然后修改绑定(bind)到临时的 ref-to-const 可以吗?

java - 导入静态与静态最终

c++ - 将 temp 分配给 const ref 成员会导致段错误