ich genau verstehe nicht, warum man nicht ein std::reference_wrapper
wie diese verwenden:Warum wird std :: reference_wrapper nicht implizit auf eine Referenz umgewandelt, wenn die Mitgliedsfunktion aufgerufen wird?
#include <vector>
#include <functional>
struct Foo
{
void f() {};
};
int main()
{
std::vector<std::reference_wrapper<Foo>> vrFoo;
Foo foo;
vrFoo.push_back(foo);
// vrFoo[0].f(); // error
vrFoo[0].get().f(); // or static_cast<Foo&>(v[0]).f();
}
Warum müssen wir die get()
Member-Funktion nutzen? Es sieht aus wie std::reference_wrapper
hat eine implizite Umwandlung zu T&
über operator T&() const noexcept
, siehe http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper also warum nicht v[0]
implizit in eine Referenz umgewandelt?
In anderen Situationen, wie
std::cout << v[0] << std::endl
diese Umwandlung stattfindet (Ich gehe davon aus hier, dass Foo
Überlastungen operator<<
)
Es ist ein Klassenmitglied Zugriff. Die Elementfunktion wird immer in der Art der LHS nachgeschlagen, und es gelten keine impliziten Konvertierungen. Die Alternative (Überladen des Operators) ist schwierig korrekt zu spezifizieren; Im Laufe der Jahre gab es zahlreiche Vorschläge dazu. Die neueste Version ist http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4173.pdf –