下面的代码是不好的做法还是未定义的行为?本质上,我正在调用 const func 来修改未标记为可变的成员。演示链接
感谢 Mehrdad 对这个问题的启发(他的问题Do this code subvert the C++ type system?)和 david 对演示的微小改进。
#include <iostream>
using namespace std;
struct BreakConst
{
int v;
int *p;
BreakConst() { v = 0; p = &v; }
void break_stuff() const { ++*p; }
};
void f(const BreakConst& bc) {
bc.break_stuff();
}
大多数答案基于的原始版本:
David Rodríguez、jpalecek、Mehrdad 回答
是:这是“未定义的行为”
int main()
{
const BreakConst bc;
cout << bc.v << endl; // 0
bc.break_stuff(); // O:)
cout << bc.v << endl; // 1
return 0;
}
新的替代问题:
Mehrdad 回答
否:这不是“未定义的行为”
int main()
{
BreakConst bc;
cout << bc.v << endl; // 0
f(bc); // O:)
cout << bc.v << endl; // 1
return 0;
}
结果:
0
1