【发布时间】:2012-06-20 02:39:54
【问题描述】:
我了解在 C++ 中使用 const 方法意味着对象通过该方法是只读的,但它仍可能会更改。
但是,这段代码显然通过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(而不仅仅是指针) -- 似乎暗示 (by Stroustrup) 在构造之后以任何方式修改 bc 会导致未定义的行为,即使构造函数和调用者在没有看到彼此定义的情况下无法知道这一点。
【问题讨论】:
-
这有点跑题了,但是
void (void)是一个不推荐使用的构造,因为void ()自 C++98 和 C99 以来已经做了同样的事情。 -
@moshbear:我不知道是什么让我写的(向后兼容 C 或其他东西?!);修好了,谢谢。 :-)
-
我喜欢你的
O:)笑脸有双重含义,即快乐的天使和震惊的惊恐的脸,这取决于你从哪个方向阅读。 -
您可以在这里找到更多输入:stackoverflow.com/q/9939399/15161(人们不喜欢的类似问题:))
-
这是我受stackoverflow.com/questions/11091385/…启发的问题,它也不需要另一个结构;)
标签: c++ constants const-correctness aliasing