31 Stimmen

typedef Zeiger const weirdness

Beachten Sie bitte den folgenden Code:

typedef struct Person* PersonRef;
struct Person {
  int age;
};

const PersonRef person = NULL;

void changePerson(PersonRef newPerson) {
  person = newPerson;
}

Aus irgendeinem Grund beschwert sich der Compiler, dass der Nur-Lese-Wert nicht zugewiesen werden kann. Aber die const Schlüsselwort sollte den Zeiger nicht konstant machen. Irgendwelche Ideen?

0voto

o11c Punkte 14369

Als Ergänzung zu Piotrs (akzeptierter) Antwort ist es möglich, die GCC-spezifischen typeof :

static_assert(std::is_same<const int *, std::add_const_t<std::remove_pointer_t<intptr>> *>::value, "not same via type_traits");
static_assert(std::is_same<const int *, std::remove_reference_t<decltype(std::as_const(*intptr()))>*>::value, "not same via decltype");

Durch Veränderung foo_t<T> a foo<T>::type oben und/oder mit der Version von boost ist es sogar möglich, dies in C++98 zu tun, obwohl es erst seit C++11 hübsch ist.


Alternativ können Sie auch zwei verschiedene Typendefinitionen verwenden, was auch für andere Fälle als einfache Zeiger funktioniert. Betrachten Sie zum Beispiel jeden Container's iterator y const_iterator Typendefinitionen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X