gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 10:05:18 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com