2015-03-27 2 views
7

Nach der Frage std::array c++11 initializer syntax error Es ist nicht zuweisen verspannt Liste erlaubt ist :: Array in einer solchen Art und Weise std:Initializer Syntaxfehler tritt nicht mehr mit std :: array

std::array<int, 10> a = {0,1,2,3,4,5,6,7,8,9}; 
a = {0}; // error: cannot assign to an array from a braced list 

Aber ich kann eigentlich nicht reproduzieren diesen Fehler mehr. Meine GCC-Version ist 4.8.2. Hier ist der Code:

#include <array> 

int main() { 

    std::array<int, 10> a; 

    a = {1}; 

    return 0; 
} 

Es kompiliert und führt ohne Fehler.

Also ist die Frage, mache ich hier etwas falsch? Oder gab es Veränderungen, die zu einer solchen Verhaltensänderung führten?

+0

Der Compiler erstellt ein temporäres 'std :: array'-Objekt aus der abgestützten Initialisierungsliste und weist es dann Ihrer' a'-Variablen zu. –

+0

Ja, es ist klar für mich. Aber die Frage wurde absichtlich gestellt, um zu verstehen, was in der Implementierung geändert wurde und warum. – rzhurov

+0

Nichts, es ist nur, dass der Compiler "repariert" wurde. C++ - Compiler sind sehr komplizierte Programme und enthalten wie alle nicht-trivialen Programme Fehler. –

Antwort

1

Der Ausdruck a = {1}; entspricht Fall (10) der Copy-List-Initialisierung (siehe). Also sollte es nach dem Standard korrekt sein.

Das Problem, das aufgetreten ist, kann etwas mit der folgenden Änderung von C++ 11 zu C++ 14 zu tun haben: In C++ 11, bei der Aggregat-Initialisierung, geschweifte Klammern um verschachtelte Initialisierungslisten möglicherweise nur wenn die Syntax ... = {...} wird verwendet, aber nicht ...{...}. In C++ 14 ist letzteres ebenfalls erlaubt. Details finden Sie unter here. Angenommen, C++ 11, sollte a = {1}; korrekt sein oder nicht? Ich denke, die Antwort hängt davon ab, wie Sie den Standard interpretieren. Offensichtlich wird {1} verwendet, um den zweiten Operanden operator= zu initialisieren. Es folgen zwei mögliche Erklärungen, die jeweils eine positive und eine negative Antwort geben.

Erläuterung für eine positive Antwort: Die Syntax ... = {...} führt copy-list-init aus, während ...{...} direct-list-init ausführt. Also, was der Standard sagt, ist, dass Klammer Elision in Copy-List-Init erlaubt ist, aber nicht Direct-List-Init. a = {1}; führt copy-list-init aus. Also die Elision ist in Ordnung.

Erklärung für eine negative Antwort: Geben Sie dem Standard nur eine wörtliche Interpretation. Elision ist OK mit dem Auftreten eines Gleichheitszeichens, und nicht anders. In a = {1}; ist die Initialisierung des Operanden operator= implizit ohne ein Gleichheitszeichen. Also, es ist nicht OK. Die Aussage here scheint diese wortgetreue Erklärung nahe zu legen.

Verwandte Themen