dies wird nicht kompiliert (Android Studio mit NDK und clang) mit einem "call to deleted constructor of c" fehler. Ich weiß, dass ich z. Verwenden Sie eine std::vector
und emplace_back()
, um ein Element direkt im Container zu konstruieren, aber in meinem Code möchte ich nur Container mit fester Größe und nicht kopierbare/bewegliche Objekte zur Optimierung verwenden. Vermutlich vermisse ich hier etwas Grundlegendes, aber gibt es keine Möglichkeit, das std::array
zu initialisieren, ohne zuerst die einzelnen Elemente konstruieren zu müssen und sie dann dorthin zu kopieren?initialisieren std :: array ohne kopieren/verschieben von elementen
Antwort
können Sie Klammer eingeschlossen initializers anstelle von temporären c
Objekte verwenden:
std::array<c,2> array = {{{"",""},{"",""}}};
oder
std::array<c,2> array{{{"",""},{"",""}}};
Ist es eine tragbare Lösung? Ich meine, es hängt davon ab, wie std :: array implementiert ist, es muss genau ein Element vom Typ 'T [N]' enthalten. – marcinj
@marcinj Ich bin mir ziemlich sicher. Das letzte Mal, als ich die Anforderung überprüft habe, war nicht, dass 'std :: array' genau ein Element vom Typ' T [N] 'enthält, sondern dass es sich so verhält, als ob es das getan hätte. Es gab eine ganze Frage darüber, ob das mittlere '{}' weggelassen werden könnte, d. H. Ob dies auch gültig sein sollte: '{{" ""} {{"}" {}}}. Diese letzte Sache könnte sich seit C++ 11 geändert haben. – juanchopanza
Ich frage, weil ich eine SO gelesen habe, wo T.C. sagte, dass es nicht garantiert ist: http://stackoverflow.com/questions/27669200/how-should-i-brace-initialize-an-stdarray-of-stdpairs#comment43754338_27669457. – marcinj
Es wäre seit 17 ++ C möglich geworden, aus, dass bei einigen bestimmten Fällen copy elision garantiert .
Unter den folgenden Umständen werden die Compiler erforderlich die Kopier- und Bewe- Konstrukteuren der Klasse wegzulassen Objekte auch wenn kopieren/verschieben Konstruktor und der Destruktor haben beobachtbare Nebenwirkungen:
Wenn der Initialisierungsausdruck in der Initialisierung ein Prvalue ist und die cv-unqualifizierte Version des Quelltyps dieselbe Klasse wie die Klasse des Ziels ist, wird der Initialisierungsausdruck verwendet, um das Zielobjekt zu initialisieren:
T x = T(T(T())); // only one call to default constructor of T, to initialize x
Und für diese Fälle, Kopieren/Verschieben Konstruktor ist nicht zugänglich sein erforderlich.
When copy-elision takes place (until C++17)
In those cases where copy-elision is not guaranteed, if it takes place (since C++17)
und die Kopier-/move-Konstruktor nicht aufgerufen wird, es muss vorhanden sein und zugänglich (als ob keine Optimierung überhaupt passiert ist), da sonst das Programm schlecht ausgebildet.
- 1. Initialisieren Sie std :: array mit einem Bereich (Paar von Iteratoren)
- 2. initialisieren std :: Array von Parametern Pack aus beliebigem Index
- 3. Konvertieren von std :: complex zwischen Array von zwei Elementen.
- 4. initialisieren Array von Primitiven
- 5. Array von Std erhalten: Vektor
- 6. Einfach eine Std :: Liste von Std :: Strings initialisieren?
- 7. initialisieren C-Stil-Array mit Nicht-Null-Wert ohne Schleifen
- 8. Initialisieren anonymen Array von Zeigern
- 9. ein String-Array initialisieren
- 10. Initialisieren eines zweidimensionalen std :: vector
- 11. initialisieren Struct von Array-Schlüssel
- 12. Func von einem Array initialisieren
- 13. Wie initialisieren Array von Klassen?
- 14. C - Array von Strukturen initialisieren
- 15. PHP Array von Elementen
- 16. Initialisieren von 2D-Int-Array in Laufzeit
- 17. Konvertieren von std :: array in std :: vector
- 18. Array-Größe von einem anderen Array-Wert initialisieren
- 19. Get Größe von std :: array ohne eine Instanz
- 20. D: Hinzufügen von Elementen zum Array ohne zu kopieren
- 21. initialisieren Array von Arrays mit demselben Element
- 22. Verwenden eines Makros zum Initialisieren eines großen Array von Nicht-Copy-Elementen
- 23. Array mit Lazy-Elementen
- 24. Q: Std :: Tupel/Std :: Array
- 25. das Array Initialisieren in C++
- 26. Ausrichten von Elementen ohne Polsterung
- 27. Initialisieren mehrerer Referenzen mit Std :: tie
- 28. Initialisieren eines KeyValuePair Array
- 29. PHP initialisieren Klassenvariablen ohne Konstruktor
- 30. Einfügen von Elementen in Array
Durch die Art und Weise Sie nicht brauchen diese Unterstrichen in Ihren Parameternamen zu setzen. 'C (std :: Zeichenkette a, Std :: Zeichenkette b, Std :: Zeichenkette c): a {a}, b {b}, c {c} {}' hat keine Ambiguitätsprobleme und tut, was Sie erwarten. – nwp