Czy ten kod obala system typu C ++?
Rozumiem, że posiadanieconst
metoda w C ++ oznacza, że obiekt jest tylko do odczytu przez tę metodę, ale może się jeszcze zmienić w inny sposób.
Jednak ten kod najwyraźniej zmienia obiekt poprzezconst
odniesienie (tj. przez aconst
metoda).
Czy ten kod jest legalny w C ++?
Jeśli tak: czy to łamieconst
-ness systemu typów? Dlaczego? Dlaczego nie?
Jeśli nie: Dlaczego nie?
Uwaga 1: Zmodyfikowałem ten przykład nieco, więc odpowiedzi mogą odnosić się do starszych przykładów.Edytuj 2: Widocznie nawet nie potrzebujesz C ++ 11, więc usunąłem tę zależność.#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;
}
Aktualizacja:Zmigrowałem lambdę na listę inicjalizacyjną konstruktora, ponieważ pozwala mi to później powiedziećconst BreakConst bc;
, które - ponieważbc
samo jest teraz const (zamiast zwykłego wskaźnika) - wydaje się sugerować (przez Stroustrup) to modyfikowaniebc
w jakikolwiek sposób po skonstruowaniu powinno doprowadzić do niezdefiniowanego zachowania, nawet jeśli konstruktor i wywołujący nie mieliby sposobu, aby o tym wiedzieć, nie widząc nawzajem definicji.