「Effective C++、Second Edition」という本を読んでいます。その本では、const メンバー関数と、ビットごとの const ネスと概念的な const ネスについて説明しています。
ほとんどのコンパイラはビット単位の const-ness を使用すると言われています。つまり、const メンバー関数内のオブジェクトのデータ メンバーを変更することはできません。
次に、const テストでビットごとに動作しないように見えるメンバー関数の例があります。
こんなふうになります:
#include "stdafx.h"
#include <string>
#include <iostream.h>
using namespace std;
class mystring
{
public:
mystring(const char* value);
operator char *() const { return data; }
private:
char * data;
};
mystring::mystring(const char * value)
{
mystring::data = const_cast<char*>(value);
}
int main(int argc, char* argv[])
{
const mystring s = "Hello";
char * nasty = s;
*nasty = 'M';
printf("s: %c", s);
return 0;
}
これを実行すると、私の本では、 の値を変更できるようにする必要があると書かれてs
いますconst
。これは、char* データがconst char*
値と同じものを指しているためです。 *data
この場合はございませんconst
。
ただし、これを MS VC++ 6.0 で実行しようとすると、次の行でアクセス違反が発生します。 *nasty = 'M';
誰かが何が起こっているのか説明できますか? 私は何かを逃したと思いますか?
私には const があるのでmystring s
、それを変更することはできないように思えますが、本に書かれていることはぎこちないようです。