Ich habe folgendes Testprogramm:
%Vor%Ich würde erwarten, dass die mit einem Pfeil markierte Zeile die rvalue-Überladung wie den nicht konstanten Aufruf direkt darüber aufrufen würde, aber nicht.
Ist das nur ein Fehler in GCC oder gibt es etwas im Standard, das die Lvalue-Überladung verursacht?
Gemäß dem Standard §12.2 [class.temporary]
:
Provisorien des Klassentyps werden in verschiedenen Kontexten erstellt: Bindung a Referenz auf einen Pr-Wert (8.5.3), Rückgabe eines Pr-Wertes (6.6.3), a Konvertierung, die einen Prvalue (4.1, 5.2.9, 5.2.11, 5.4) erstellt, werfen eine Ausnahme (15.1), Eingabe eines Handlers (15.3), und in einigen Initialisierungen (8.5).
So id<int const[]>{1, 2, 3, 4, 5}
ist temporär und daher ein Prvalue §3.10 [basic.lval]
:
Ein rvalue (historisch so genannt, weil rvalues auf erscheinen könnte die rechte Seite eines Zuweisungsausdrucks) ist ein xvalue, a temporäres Objekt (12.2) oder Unterobjekt davon oder ein Wert, der nicht mit einem Objekt verknüpft.
Ein prvalue ("reiner" rvalue) ist ein rvalue, der kein xvalue ist.
Daher sollte eine überladene Funktion mit dem Argument rvalue reference ausgewählt werden.
Tags und Links const arrays c++ c++11 rvalue-reference