以下のコードは悪い習慣ですか、それとも未定義の動作ですか?基本的に、可変としてマークされていないメンバーを変更するためにconstfuncを呼び出しています。デモへのリンク
この質問(彼の質問はC ++型システムを破壊しますか? )を刺激したMehrdadの功績と、デモのマイナーな改善のための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();
}
ほとんどの回答が基づいている元のバージョン:
DavidRodrí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