Temporäres const-Array, das nicht an die rvalue-Referenz gebunden ist

8

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?

    
Simple 07.07.2013, 02:19
quelle

1 Antwort

2

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.

    
A. Mikhaylov 14.07.2013, 08:15
quelle