gpt4 book ai didi

c++ - 这段代码是否颠覆了 C++ 类型系统?

转载 作者:IT老高 更新时间:2023-10-28 21:52:29 27 4
gpt4 key购买 nike

我了解在 C++ 中具有 const 方法意味着对象通过该方法是只读的,但它仍然可能会改变。

但是,这段代码显然是通过 const 引用(即通过 const 方法)更改对象。

这段代码在 C++ 中合法吗?

如果是这样:它是否破坏了类型系统的 const 特性?为什么/为什么不?

如果不是:为什么不呢?

注意 1:我已经对示例进行了一些编辑,因此答案可能是指较旧的示例。

编辑 2:显然你甚至不需要 C++11,所以我删除了该依赖项。

#include <iostream>

using namespace std;

struct DoBadThings { int *p; void oops() const { ++*p; } };

struct BreakConst
{
int n;
DoBadThings bad;
BreakConst() { n = 0; bad.p = &n; }
void oops() const { bad.oops(); } // can't change itself... or can it?
};

int main()
{
const BreakConst bc;
cout << bc.n << endl; // 0
bc.oops(); // O:)
cout << bc.n << endl; // 1

return 0;
}

更新:

我已将 lambda 迁移到构造函数的初始化列表,因为这样做允许我随后说 const BreakConst bc;,这 -- 因为 bc 本身 现在是 const (而不仅仅是指针)——似乎暗示( by Stroustrup )在构造之后以任何方式修改 bc 都会导致未定义的行为,即使构造函数如果不查看彼此的定义,调用者将无法知道这一点。

最佳答案

oops() 方法不允许改变对象的常量。此外,它不这样做。它是你的匿名函数。这个匿名函数不在对象的上下文中,而是在允许修改对象的 main() 方法的上下文中。

您的匿名函数不会更改 oops() 的 this 指针(定义为 const,因此无法更改),也绝不会从此 this 指针派生一些非常量变量。它本身没有任何this-pointer。它只是忽略 this 指针并更改主上下文的 bc 变量(它作为参数传递给您的闭包)。此变量不是 const,因此可以更改。您还可以传递任何匿名函数来更改完全不相关的对象。这个函数不知道,它改变了存储它的对象。

如果你将它声明为

const BreakConst bc = ...

那么主函数也将其作为 const 对象处理,无法更改。

编辑:换句话说: const 属性绑定(bind)到访问对象的具体左值(引用)。它不绑定(bind)到对象本身。

关于c++ - 这段代码是否颠覆了 C++ 类型系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11077566/

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