为什么 std::reference_wrapper 在调用成员函数时不隐式转换为引用?
Why doesn't std::reference_wrapper implicitly cast to a reference when calling member function?
我不明白为什么不能使用这样的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
通过operator T&() const noexcept
隐式转换为T&
,请参阅http://en.cppreference.com/w/cpp/utility/functional/reference_wrapper那么为什么v[0]
没有隐式转换为引用呢?
在其他情况下,如
std::cout << v[0] << std::endl
这个转换发生了(我在这里假设Foo
过载operator<<
)
因为.
总是用来访问它所应用的对象的成员。不考虑类型转换。
有一个建议是允许operator.
重载,以完全实现您想要的功能,但这至少要到C++17才能成为标准,如果有的话。
正如@MikeSeymour所指出的,这是一个语言限制。
这就是为什么我认为std::reference_wrapper
应该有一个重载的operator&
,它返回被包装对象的地址:
template<class T>
struct reference_wrapper{
...
T* operator &(){return ptr;}
}
以便以后可以使用&Foo->f()
或(*&Foo).f()
来代替Foo.get().f()
或static_cast<T&>(Foo).f()
。
相关文章:
- 强制转换为引用类型
- 如何将 int 引用安全地转换为长引用?
- C 样式转换引用
- 将通用引用强制转换为可调用的 void 指针,反之亦然
- 隐式重新解释引用时强制转换,没有警告/错误
- 右值引用转换后的地址更改
- 通过引用传递参数时C++类型转换
- 为什么我需要在转换构造函数上引用 this->?
- 枚举类的 C 样式强制转换到基础类型 char 的引用
- 转换指针引用的字符串
- 隐式可转换参数,但属于引用类型
- 转换引用对象的边界框?
- C++将引用转换为指针?
- C++ 引用是否在需要时隐式转换为值?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 返回对常量结构(指针类型)成员的引用:明显的左值到右值转换
- 从基类的共享指针向下转换到派生类的引用
- 为什么 const 允许在参数中隐式转换引用
- 与强制类型转换指针相比,在dynamic_cast中使用强制类型转换引用
- 动态强制转换引用和自动转换