Was soll der Quark? Wieso initialisiert VS das Array, indem es erst mal aus den Literalen temporäre Objekte konstruiert, um sie gleich wieder zu moven, anstatt wie GCC es einfach lässt und das Array direkt mit den Konstruktoren aus den Literalen initialisiert
VS ist hier nicht standardkonform. Der Standard schreibt hier keine Temporary vor, es handelt sich also nicht um irgendeine Elidierung vom GCC.
When an aggregate is initialized by an initializer list, as specified in 8.5.4, the elements of the initializer list are taken as initializers for the members of the aggregate, in increasing subscript or member order. [...]
[ Note: If an initializer-clause is itself an initializer list, the member is list-initialized, which will result in a recursive application of the rules in this section if the member is an aggregate. — end note ]
Sprich, dass interne, echte Array von std::array wird mit { 1, 2, 3 } initialisiert. Und das wiederum heißt, dass jedes Arrayelement mit der dazugehörigen Zahl initialisiert wird. Da entsteht nirgends eine Temporary.