auto
Welche Regeln gelten für die Typableitung bei Verwendung von C ++ 11 hinsichtlich der Auflösung in einen Wert oder eine Referenz?
ZB manchmal ist es klar:
auto i = v.begin(); // Copy, begin() returns an iterator by value
Diese sind weniger klar:
const std::shared_ptr<Foo>& get_foo();
auto p = get_foo(); // Copy or reference?
static std::shared_ptr<Foo> s_foo;
auto sp = s_foo; // Copy or reference?
std::vector<std::shared_ptr<Foo>> c;
for (auto foo: c) { // Copy for every loop iteration?
// pointer
nicht wirklich notwendig ist. Nur weil ein Compiler diese Ausgabe liefert, bedeutet dies nicht, dass sie standardkonform ist. ;) In diesem Fall ist es richtig, obwohl eine bessere Erklärung gegeben werden kann, was genau passiert (der abgeleitete Typ ist "verfallen").auto&& a = ...
undT&& b = ...
(in Vorlagen) den l-Wert oder den r-Wert angeben, je nachdem, wofür der Ausdruck ausgewertet wird.§7.1.6.4 [dcl.spec.auto] p6
Dies bedeutet nichts anderes als das
auto
Modellieren der Ableitung von Vorlagenargumenten während eines Funktionsaufrufs.template<class T> void f(T){} // #1, will also be by-value template<class T> void g(T&){} // #2, will always be by-reference
Beachten Sie, dass # 1 das übergebene Argument immer kopiert, unabhängig davon, ob Sie eine Referenz oder etwas anderes übergeben. (Es sei denn, Sie geben ausdrücklich das Vorlagenargument wie an
f<int&>(intref);
.)quelle
auto
dort funktioniert genauso.for(auto val : range)
wird immer kopieren,for(auto& ref : range)
wird immer eine Referenz sein. Und noch mehr zu verwirrenfor(auto&& x : range)
ist entwederT&&
oderT&
hängt davon ab, ob*begin(range)
ein Wert oder eine Referenz zurückgegeben wird.Was auch immer Sie von der rechten Seite (von "=") erhalten, ist niemals eine Referenz. Insbesondere ist das Ergebnis eines Ausdrucks niemals eine Referenz. Beachten Sie in diesem Licht den Unterschied zwischen den Ergebnissen im Beispiel.
#include <typeinfo> #include <iostream> template< typename T > struct A { static void foo(){ std::cout<< "value" << std::endl; } }; template< typename T > struct A< T&> { static void foo(){ std::cout<< "reference" << std::endl; } }; float& bar() { static float t=5.5; return t; } int main() { auto a3 = bar(); A<decltype(bar())>::foo(); // reference A<decltype(a3)>::foo(); // value }
quelle