0 ist ein Nullzeiger Konstante
S.4.9:
Ein Nullzeiger Konstante ist ein integraler konstanter Ausdruck (5.19) R-Wert von Integer-Typ, die auf Null auswertet.
Ein Nullzeiger Konstante kann zu jedem anderen Zeigertyp umgewandelt werden:
S.4.9:
A null konstante Zeiger kann auf einen Zeigertyp umgewandelt werden; das Ergebnis ist der Null-Zeiger-Wert dieser Typ
Was Sie für die Definition von A
gab ein Aggregat betrachtet:
S.8.5.1:
Ein Aggregat ist ein Array oder eine Klasse ohne von Benutzern deklarierte Konstruktoren, keine privaten oder geschützten nicht statische Datenelemente, keine Basisklassen und keine virtuellen Funktionen.
Du Angabe einer Initialisierer-Klausel:
S.8.5.1:
Wenn ein Aggregat der Initialisierer initialisiert wird von einer Klammer einen Initialisierer-Klausel enthalten kann, die aus geschlossenen, durch Kommata getrennte Liste von Initialisierer-Klauseln für die Mitglieder des Aggregats
A
enthält ein Mitglied des Aggregats vom Typ std::string
, und die Initialisierungsklausel gilt dafür.
Ihr Aggregat ist kopier initialisierten
Wenn ein Aggregat (ob Klassen- oder Array) Mitglieder des Klassentypen enthält und durch eine geschweifte Klammer eingeschlossen Initialisierer-Liste initialisiert, wobei jedes solches Element Exemplar -initialisiert.
Kopieren Mittel initialisiert, die Ihnen entspricht std::string s = 0
oder std::string s = 42
haben;
S.8.5-12
Die Initialisierung, die in Argumentübergabe, Funktionsrückgabe auftritt, eine Ausnahme (15.1) zu werfen, Handhabung eine Ausnahme (15.3) und in geschweiften Klammern stehenden Initialisierer Listen (8,5 .1) heißt Kopierinitialisierung und entspricht der Form T x = a;
std::string s = 42
kompiliert nicht, weil es keine implizite Konvertierung ist, std::string s = 0
kompiliert (weil eine implizite Konvertierung vorhanden ist), führt aber zu undefinierten Verhalten.
std::string
‚s Konstruktor für const char*
nicht als explicit
definiert, was bedeutet, Sie können dies tun: std::string s = 0
Nur um zu zeigen, dass die Dinge tatsächlich Kopie initialisiert ist, könnten Sie diesen einfachen Test machen:
class mystring
{
public:
explicit mystring(const char* p){}
};
struct A {
mystring s;
};
int main()
{
//Won't compile because no implicit conversion exists from const char*
//But simply take off explicit above and everything compiles fine.
A a = {0};
return 0;
}
Die Klassenschablone 'boost :: array' ist ebenfalls ein Aggregat. So können Sie zum Beispiel 'array a = {" foo "," bar "};' damit machen. Mein Lazy-Construct-Array ist auch ein Aggregat: http://stackoverflow.com/questions/2662417/c-suppress-automatic-initialization-and-destruction/2662526#2662526 –
Implizite Konvertierungen + Aggregate ... ಠ_ಠ –
@litb als ich das erste Feature von 'boost :: array' sah, hatte ich eine Erleuchtung, AKA sexuelle Befriedigung-des-Gehirns. Einfache Dinge, die so viel Sinn machen, tendieren dazu, mir das zu antun. – wilhelmtell