Я понимаю, что наличие метода const
в C ++ означает, что объект доступен только для чтения с помощью этого метода, но в противном случае он все равно может измениться.
Однако этот код, очевидно, изменяет объект с помощью ссылки const
(т.е. с помощью метода const
).
Законен ли этот код на C ++?
Если да: нарушает ли это const
-ность системы типов? Почему, почему нет?
Если нет: почему бы и нет?
Примечание 1. Я немного отредактировал пример, поэтому ответы могут относиться к более старым примерам.
Изменить 2: По-видимому, вам даже не нужен C ++ 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
после построения должно привести к неопределенному поведению, даже если конструктор и вызывающий у них нет возможности узнать это, не видя определения друг друга.
void (void)
является устаревшей конструкцией, посколькуvoid ()
делает то же самое, начиная с C ++ 98 и C99. - person moshbear   schedule 18.06.2012O:)
имеет двойное значение: счастливый ангел и потрясенное испуганное лицо, в зависимости от того, с какого направления вы его читаете. - person Peter Olson   schedule 18.06.2012