This question already has an answer here:
How to correctly use std::reference_wrappers
(1个答案)
2年前关闭。
我不明白为什么不能使用这样的
为什么我们必须使用
那么为什么
在其他情况下,例如
发生这种转换(我在这里假设
(1个答案)
2年前关闭。
我不明白为什么不能使用这样的
std::reference_wrapper
:#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();
}
为什么我们必须使用
get()
成员函数?看来std::reference_wrapper
已通过T&
隐式转换为operator T&() const noexcept
,请参阅http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper那么为什么
v[0]
不隐式转换为引用呢?在其他情况下,例如
std::cout << v[0] << std::endl
发生这种转换(我在这里假设
Foo
重载operator<<
) 最佳答案
因为.
始终用于访问它所应用于的对象的成员。不考虑类型转换。
有一个proposal允许operator.
重载,以完全启用您想要的功能,但是直到至少C++ 17才成为标准。
关于c++ - 为什么在调用成员函数时std::reference_wrapper没有隐式转换为引用?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28350407/