C ++: Konvertierungen von lvalue-Referenzen und rvalue-Referenzen

9

Ich frage mich, welche Teile des Standards das im folgenden Code-Segment spezifizieren:

%Vor%

(d) kompiliert und (c) nicht. Bitte fügen Sie die relevanten Teile des Standards in Ihre Antwort ein oder beziehen Sie sich entsprechend darauf. Nur als Referenz, Ubuntu Clang Version 3.6.2-1 (Tags / RELEASE_362 / final) (basierend auf LLVM 3.6.2) gibt mir

%Vor%

und gcc (Ubuntu 5.2.1-22ubuntu2) 5.2.1 20151010 gibt mir

%Vor%

Bearbeiten:

Um meine Frage klarer zu machen, lass mich hinzufügen

%Vor%

Was hält (f) vom Kompilieren, wenn (d) das tut? Offensichtlich sind A und C nicht verwandt, aber wo wird das erkannt, wenn der std::unique_ptr -Konstruktor, der verwendet wurde, um das temporäre für sowohl (d) als auch (f) zu konstruieren,

ist %Vor%     
apriori 22.01.2016, 16:15
quelle

1 Antwort

4

Der Hauptunterschied zwischen Ihren Fällen liegt in der Tatsache, dass rvalue-Referenzen indirekt (über ein temporäres) binden können, während nicht const lvalue-Referenzen dies nicht können. In beiden Fällen (c) und (d) ist der Initialisierer dem Typ, der in [dcl.init.ref] / (5.1) , daher muss [dcl.init.ref] / (5.2) gelten - sofort ausgeschlossen (c):

  

Andernfalls muss die Referenz eine Referenz auf a sein   nichtflüchtiger const type (d. h. cv1 soll const sein) oder die Referenz   soll eine rvalue Referenz sein.

Beachten Sie auch, dass unique_ptr<A> und unique_ptr<B> unterschiedliche, nicht verwandte Typen sind, unabhängig davon, wie A und B verwandt sind.

Sie können diese Regel auch mit Skalaren beobachten :

%Vor%     
Columbo 22.01.2016 16:24
quelle

Tags und Links