我明白有一个const
C++ 中的方法意味着对象通过该方法是只读的,但否则它仍然可能会发生变化。
然而,这段代码显然通过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;
}
Update:
我已将 lambda 迁移到构造函数的初始化列表中,因为这样做可以让我随后说const BreakConst bc;
,其中 - 因为bc
itself现在是 const (而不仅仅是指针)——似乎意味着(通过斯特鲁斯特鲁普 https://stackoverflow.com/a/2271055/541686) 修改bc
构造后以任何方式都应该导致未定义的行为,即使构造函数和调用者在没有看到彼此的定义的情况下无法知道这一点。
oops() 方法不允许更改对象的常量。此外,它不这样做。它是由你的匿名函数完成的。这个匿名函数不在对象的上下文中,而是在允许修改对象的 main() 方法的上下文中。
您的匿名函数不会更改 oops() 的 this 指针(它被定义为 const,因此无法更改),也不会从该 this 指针派生出一些非常量变量。它本身没有任何 this 指针。它只是忽略 this 指针并更改主上下文的 bc 变量(它作为参数传递给闭包)。该变量不是 const,因此可以更改。您还可以传递任何匿名函数来更改完全不相关的对象。该函数不知道它正在更改存储它的对象。
如果你将其声明为
const BreakConst bc = ...
那么 main 函数也会将其作为 const 对象处理并且无法更改它。
Edit:
换句话说: const 属性绑定到访问对象的具体左值(引用)。它不绑定到对象本身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)