Explizites Initialisieren des Zeigervektors führt zu einem Konvertierungsfehler?

9

Bedenken Sie Folgendes:

%Vor%

Dies kompiliert sich gut mit VC ++ 10 (keine Warnungen sogar bei maximaler Warnstufe). Allerdings kompiliert es nicht mit llvm auf Mac oder gcc auf Linux, was einen Fehler wie "Zuweisung zu int * von inkompatiblem Typ const int." Ich suche nicht nach Lösungen - ich weiß, dass der zweite Parameter unnötig ist oder dass ein static_cast den Fehler behebt.

Ich dachte, dass Null implizit in einen beliebigen Zeigertyp konvertierbar ist. Was gibt? Ich kann Folgendes tun:

%Vor%

Ich verstehe, dass die Vektorkonstruktorsignatur ein const T& hat, das, wenn es für vector<int*> erweitert wird, int* const& korrekt wird? Kann jemand erklären, was hier vor sich geht und ob der VC ++ - oder der Nicht-VC ++ - Compiler korrekt ist?

    
Tabber33 04.04.2012, 19:03
quelle

2 Antworten

2

Es sieht aus wie g ++ eigentlich falsch hier. Siehe C ++ 98 23.1.1 / 9:

  

Für jede in dieser Klausel und in Klausel 21 definierte Sequenz:

     

- die   Konstruktorvorlage X (InputIterator f,   InputIterator l, const Allocator & amp; a = Zuweiser ())

     

soll das selbe haben   Effekt wie: X(static_cast<typename X::size_type>(f), static_cast<typename X::value_type>(l), a) wenn InputIterator ein ist   integraler Typ.

Beachten Sie, dass InputIterator ein Vorlagenparameter für den Konstruktor ist, der in diesem Fall int für Ihr Beispiel und somit ein ganzzahliger Typ ist. Die g ++ - Bibliothek verfügt über einen speziellen Code, um alle Fälle zu behandeln, in denen der Typ, der in vector gespeichert ist, ebenfalls integral ist und alle korrekt funktionieren. In diesem Fall, nur weil Sie 0 verwendet haben, wäre die vom Standard vorgeschriebene static_cast tatsächlich zulässig. Ich habe versucht, den Code zu kompilieren, den der Standard sagt, sollte äquivalent sein und es kompiliert mit g ++ 4.5.

    
Mark B 04.04.2012, 20:12
quelle
2

std::vector hat einen unangenehmen Konstruktor mit dieser Signatur

%Vor%

Wenn der Compiler InputIterator als int (!) von Ihren Parametern 0 und 1 abzieht, passt das gut, aber nicht das, was wir wollen.

Ich glaube, C ++ 11 erfordert, dass der Compiler versucht, herauszufinden, ob die Parameter tatsächlich Iteratoren sein können oder nicht. In C ++ 03 würden sie wahrscheinlich als size_type(1) und int(0) enden und Ihr Problem verursachen.

Das Integer-Literal 0 ist in einen Null-Zeiger konvertierbar, aber ein int mit dem Wert 0 ist nicht!

    
Bo Persson 04.04.2012 19:14
quelle

Tags und Links