Подрывает ли этот код систему типов C++?

Я понимаю, что наличие метода constв C++ означает, что объект читается -только с помощью этого метода, но в противном случае он может измениться.

Однако этот код, по-видимому, изменяет объект через ссылку const(, т.е. через метод const).

Является ли этот код законным в C++?

Если да, :Нарушает ли этоconst-система типов? Почему, почему нет?

Если нет :Почему?

Примечание 1 :Я немного отредактировал пример,поэтому ответы могут относиться к более старым примерам.

Редактировать 2 :Судя по всему, вам даже не нужен C++11, поэтому я удалил эту зависимость.

#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после построения должно привести к неопределенному поведению, даже если конструктор и вызывающая сторона не смогут узнать об этом, не видя определения друг друга.

20
задан Community 23 May 2017 в 11:49
поделиться