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,
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%Tags und Links c++ c++14 rvalue-reference