Я читаю книгу под названием «Эффективный С++, второе издание», в которой говорится о константных функциях-членах и о том, как у вас есть побитовая константность и концептуальная константность.
В нем говорится, что большинство компиляторов будут использовать побитовую константность, то есть вы не можете изменять данные-члены объекта внутри константной функции-члена.
Затем есть пример функции-члена, которая, похоже, не работает побитно в тесте 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';
.
Может кто-нибудь объяснить, что происходит? Я думаю, что я что-то пропустил?
Мне кажется, что поскольку у нас есть константа mystring s
, мы не должны иметь возможности ее изменить, но тогда то, что написано в книгах, кажется неудобным.