我知道const
在 C++ 中有一个方法意味着一个对象通过该方法是只读的,但它可能仍然会改变。
然而,这段代码显然是通过const
引用(即通过const
方法)改变了一个对象。
这段代码在 C++ 中合法吗?
如果是这样:它是否破坏const
了类型系统的-ness?为什么/为什么不?
如果不是:为什么不呢?
注意 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 (而不仅仅是指针) - 似乎暗示(由 Stroustrup)bc
以任何方式修改构造后应该导致未定义的行为,即使构造函数和调用者在没有看到彼此的定义的情况下无法知道这一点。