Const-ness des verschachtelten Typs erkennen

7

Normalerweise, wenn ich feststellen muss, ob ein Typ const ist, verwende ich einfach boost::is_const . Beim Versuch, die Konstanz eines verschachtelten Typs zu erkennen, geriet ich jedoch in Schwierigkeiten. Betrachten Sie die folgende Merkmalschablone, die auf const Typen spezialisiert ist:

%Vor%

Das Problem ist, dass boost::is_const anscheinend nicht erkennt, dass traits<const T>::reference ein const -Typ ist.

Zum Beispiel:

%Vor%

Dies gibt aus: false false

Warum gibt es nicht false true aus?

    
Channel72 13.01.2011, 18:38
quelle

3 Antworten

13

Da die Referenz nicht const ist, ist es der Typ, auf den referenziert wird. Richtig, es gibt keine const Referenzen. Stellen Sie sich also vor, dass die Referenz ein Zeiger ist, dann ist der Unterschied leichter zu verstehen: int const* nicht const, int *const ist const.

Verwenden Sie remove_reference, um den tatsächlichen const-Typ zu erhalten:

%Vor%     
ybungalobill 13.01.2011, 18:40
quelle
6

Weil Referenzen nicht const sind. :)

Sie haben eine ref-to-const (betrachten Sie eine grobe Analogie, int const* , wobei der Zeiger int einen const -Kontext hat, aber der Zeiger selbst nicht). Der Standard vermischt die Terminologie hier, aber ich vermeide den Begriff "const ref", der sehr irreführend ist.

Referenzen sind von Natur aus unveränderlich, da sie nur initialisiert und dann nicht wieder gebunden werden können, aber das macht sie nicht const .

Sie können die Referenz vom Typ mit boost::remove_reference entfernen (wie in anderen Antworten angegeben).

    
quelle
4

Nun, haben Sie bemerkt, dass is_const<int const&>::value ebenfalls falsch ist? Es ist. So etwas sollte zu den ersten Dingen gehören, die Sie ausprobieren, um solche Templates zu debuggen. Eine andere Sache, die Sie verwenden können, ist ein Drucker Typ:

template < typename T > struct print;

Wenn Sie instanziieren, erhalten Sie bei den meisten Implementierungen, was immer T in der Fehlerausgabe ist.

Versuchen Sie dies, um Ihr aktuelles Problem zu lösen:

is_const< remove_reference< traits<int const>::reference >::type >::value

    
Crazy Eddie 13.01.2011 18:46
quelle

Tags und Links