Nie rozumiem, dlaczego nie można użyć std::reference_wrapper
takiego:Dlaczego std :: reference_wrapper niejawnie rzutuje na odwołanie podczas wywoływania funkcji składowej?
#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();
}
Dlaczego musimy użyć funkcji get()
członkiem? Wygląda na to, że std::reference_wrapper
ma niejawną konwersję na T&
poprzez operator T&() const noexcept
, zobacz http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper , więc dlaczego nie jest v[0]
niejawnie przekonwertowane na odniesienie?
W innych sytuacjach, takich jak
std::cout << v[0] << std::endl
ta konwersja odbywa (zakładam tu, że Foo
przeciążenia operator<<
)
Jest to dostęp dla członków klasy. Funkcja elementu zawsze jest sprawdzana w typie LHS i nie są stosowane żadne niejawne konwersje. Alternatywa (przeciążenie 'operatora') jest trudna do określenia poprawnie; od lat pojawiały się liczne propozycje dotyczące tej kwestii. Najnowszym jest http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4173.pdf –