class C
{
public:
C() : arr({1,2,3}) //doesn't compile
{}
/*
C() : arr{1,2,3} //doesn't compile either
{}
*/
private:
int arr[3];
};
Ich glaube, der Grund dafür ist, dass Arrays nur mit =
Syntax initialisiert werden können, dh :
int arr[3] = {1,3,4};
Fragen
- Wie kann ich tun, was ich tun möchte ( dh ein Array in einem Konstruktor initialisieren (keine Elemente im Body zuweisen)). Ist es überhaupt möglich?
- Sagt der C ++ 03-Standard etwas Besonderes über die Initialisierung von Aggregaten (einschließlich Arrays) in CTOR-Initialisierern? Oder ist die Ungültigkeit des obigen Codes eine Folge einiger anderer Regeln?
- Lösen C ++ 0x-Initialisiererlisten das Problem?
PS Bitte erwähnen Sie keine Vektoren, Boost :: Arrays und deren Überlegenheit gegenüber Arrays, die mir bekannt sind.
c++
c++11
initializer-list
ctor-initializer
aggregate-initialization
Armen Tsirunyan
quelle
quelle
Antworten:
Ja. Es wird eine Struktur verwendet, die ein Array enthält. Sie sagen, Sie wissen das bereits, aber dann verstehe ich die Frage nicht. Auf diese Weise Sie tun ein Array im Konstruktor initialisieren, ohne Zuweisungen im Körper. Das
boost::array
macht es.Ein Mem-Initialisierer verwendet die direkte Initialisierung. Und die Regeln von Klausel 8 verbieten so etwas. Ich bin mir über den folgenden Fall nicht ganz sicher, aber einige Compiler erlauben dies.
Weitere Informationen finden Sie in dieser GCC PR .
Ja, das tun sie. Ihre Syntax ist jedoch ungültig, denke ich. Sie müssen Klammern direkt verwenden, um die Listeninitialisierung auszulösen
quelle
char * const foo[6];
Klassenmitglied. Es erfordert die Initialisierung in C ++ 11 zu kompilieren.C ++ 98 bietet keine direkte Syntax für etwas anderes als das Nullstellen (oder für Nicht-POD-Elemente, Wertinitialisierung) des Arrays. Dafür schreibst du einfach
C(): arr() {}
.Ich denke, Roger Pate ist falsch in Bezug auf die angeblichen Einschränkungen der C ++ 0x-Aggregatinitialisierung, aber ich bin zu faul, um sie nachzuschlagen oder zu überprüfen, und es spielt keine Rolle, oder? EDIT : Roger hat über "C ++ 03" gesprochen, ich habe es als "C ++ 0x" falsch verstanden. Entschuldigung, Roger. ☺
Eine C ++ 98-Problemumgehung für Ihren aktuellen Code besteht darin, das Array in a zu verpacken
struct
und es anhand einer statischen Konstante dieses Typs zu initialisieren. Die Daten müssen sich sowieso irgendwo befinden. Aus der Manschette kann es so aussehen:quelle
Problemumgehung:
quelle
In C ++ 03 gilt die aggregierte Initialisierung nur mit einer Syntax wie der folgenden. Diese muss eine separate Anweisung sein und passt nicht in einen ctor-Initialisierer.
quelle
Wie wäre es mit
?
Kompiliert gut auf g ++ 4.8
quelle
Sie möchten ein Array von Ints in Ihrem Konstruktor initiieren? Zeigen Sie auf ein statisches Array.
quelle