können Elementfunktionen verwendet werden, um Elementvariablen in einer Initialisierungsliste zu initialisieren?
OK, member-Variablen verwendet werden können zu initialisieren anderen member-Variablen in einer Initialisierungs-Liste (mit Sorgfalt über die Initialisierungs-Reihenfolge etc). Was ist mit member-Funktionen? Um genau zu sein, ist dieses snippet rechtliche nach der C++ standard?
struct foo{
foo(const size_t N) : N_(N), arr_(fill_arr(N)) {
//arr_ = fill_arr(N); //or should I fall back to this one?
}
std::vector<double> fill_arr(const size_t N){
std::vector<double> arr(N);
//fill in the vector somehow
return arr;
}
size_t N_;
std::vector<double> arr_;
//other stuff
};
InformationsquelleAutor der Frage ev-br | 2012-06-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ja, nutzen Sie die member-Funktion im Initialisierungs-Liste ist gültig und entspricht der Norm.
Mitglieder-Daten initialisiert sind in der Reihenfolge Ihrer Deklaration (und das ist der Grund, warum Sie erscheinen soll, in der Initialisierungs-Liste in der Reihenfolge Ihrer Deklaration - die Regel, dass Sie Folgen in Ihrem Beispiel).
N_
ist erst initialisiert und Sie können übergeben Sie diese Daten Mitgliedfill_arr
.fill_arr
wird aufgerufen, bevor der Konstruktor aber da diese Funktion nicht auf nicht initialisierte Daten-Mitglieder (es greift nicht auf die Daten der Mitglieder bei allen) seinen Ruf als sicher.Hier sind einige relevanten Ausschnitte aus dem letzten Entwurf (N3242=11-0012) der C++ - standard:
InformationsquelleAutor der Antwort Bojan Komazec
Während der Initialisierung der Objekte in der Initialisierungs-Liste, das Objekt ist noch nicht vollständig aufgebaut.
Wenn diese Funktion versucht auf das Teil, in der das Objekt noch nicht gebaut, dann ist das ein nicht definiertes Verhalten sonst alles in Ordnung ist.
sehen diese Antwort.
InformationsquelleAutor der Antwort Eight