2016-06-27 18 views
0

refPtrInt ist ein Verweis auf Zeiger:Wenn x ein Verweis auf unique_ptr ist, dann ist * x "Verweis auf Element zeigt auf"?

int *& refPtrInt;

Ist *refPtrInt ein int oder ein Verweis auf ein int?

EDIT: Vielen Dank für Ihre Antworten über refPtrInt. Eigentlich meine ursprüngliche Frage ist zu diesem Ausschnitt aus Stroustrup (einer Tour durch C++, Abschnitt 5.5):

template<typename C, typename Oper> 
void for_all(C& c, Oper op) // assume that C is a container of pointers 
{ 
    for (auto& x : c) 
    op(*x); // pass op() a reference to each element pointed to 
} 
vector<unique_ptr<Shape>> v; 
// populate v with some kinds of Shape 
for_all(v, [](Shape& s){ s.draw(); }); 

Der Kommentar "pass op() a reference to each element pointed to" von Bjarn Stroustrup ist auch. Also, *x ist offensichtlich eine Referenz auf eine Shape, wenn x ist ein Verweis auf eine unique_ptr<Shape> ... Ist das richtig?

+1

Hinweis: Eine Referenz kann normalerweise als ein anderer Name für ein vorhandenes Objekt und nicht als ein neues Objekt betrachtet werden. –

+3

Beachten Sie, dass diese Frage mit einem Compiler [einfach zu testen] (http://coliru.stacked-crooked.com/a/c517083a24fae1cf) ist. – chris

+1

@chris, die das Verhalten von 'declltype' testet und auch die Frage nicht beantwortet (jemand könnte daraus schließen, dass '* r' den Typ' int & 'hat, obwohl es das nicht tut) –

Antwort

4

Es gibt keinen Unterschied. Formal können Ausdrücke keinen Referenztyp haben. Weniger formal könnten wir jeden Ausdruck als bezeichnen, der sich auf ein Objekt bezieht. Diese Verwendung erscheint in dem von Ihnen zitierten Lehrbuch.

Formal hat der Ausdruck *refPtrIntint Typ, und sein Wert Kategorie ist lvalue, und es bezeichnet ein int Objekt.

x hat Typ unique_ptr<Shape>. Dies bedeutet, dass *x ruft die überladene Operatorfunktion:

typename std::add_lvalue_reference<T>::type std::unique_ptr::operator*() const; 

Dies ist eine Funktion mit Rückgabetyp Shape&. Es ist üblich zu sagen "Die Funktion gibt einen Verweis auf Shape zurück", aber es ist auch wichtig zu verstehen, dass das Ergebnis (*x hier) ein Ausdruck des Typs Shape und des Werttyps lvalue ist, wenn der Funktionsaufruf in einem Ausdruck verwendet wird.

1

Es ist int. Das "Referenz" -Bit ist irrelevant. Sie referenzieren den Zeiger und zeigen auf int.