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