Подрывает ли этот код систему типов C ++?
Я понимаю, что имеяconst
Метод в C ++ означает, что объект доступен только для чтения через этот метод, но в противном случае он может измениться.
Тем не менее, этот код, по-видимому, изменяет объект черезconst
ссылка (т.е. черезconst
метод).
Является ли этот код законным в C ++?
Если так: это ломаетconst
-честь системы типов? Почему, почему нет?
Если нет: почему бы и нет?
Note 1: I have edited the example a bit, so answers might be referring to older examples. Edit 2: Apparently you don't even need C++11, so I removed that dependency.#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;
}
Update:
Я перенес лямбду в список инициализации конструктора, поскольку это позволяет мне впоследствии сказатьconst BreakConst bc;
который - потому чтоbc
itself теперь const (а не просто указатель) - может показаться (Страуструп) что модифицируетbc
в любом случае после построения должно получиться неопределенное поведение, даже если конструктор и вызывающая сторона не смогут узнать об этом, не увидев друг друга & apos; определения.