Я понимаю, что наличие метода const
в C++ означает, что объект читается -только с помощью этого метода, но в противном случае он может измениться.
Однако этот код, по-видимому, изменяет объект через ссылку const
(, т.е. через метод const
).
Является ли этот код законным в C++?
Если да, :Нарушает ли этоconst
-система типов? Почему, почему нет?
Если нет :Почему?
#include
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;
}
Я перенес лямбду в список инициализации конструктора, так как это позволяет мне впоследствии сказать const BreakConst bc;
, что --, потому чтоbc
сам теперь const (вместо простого указателя)--может означать(Страуструп)что любое изменение bc
после построения должно привести к неопределенному поведению, даже если конструктор и вызывающая сторона не смогут узнать об этом, не видя определения друг друга.