在下面的代码中,我尝试使用v1
由类型引用组成的向量和v2
由类型引用组成的向量:
#include <string>
#include <vector>
int main (int argc, char* argv[])
{
std::string object ("foobar");
std::string& refobj = object;
std::vector<std::reference_wrapper<decltype(object)>> v1;
// The following line doesn't compile => error: forming pointer to reference type ‘std::__cxx11::basic_string<char>&
std::vector<std::reference_wrapper<decltype(refobj)>> v2;
std::vector<std::reference_wrapper<std::remove_reference_t<decltype(refobj)>>> v3;
}
正如预期的那样,代码编译用于v1
但不编译v2
,恕我直言,这应该没问题;在这种情况下,引用包装器不应该执行任何操作,因为提供的类型已经是引用。
请注意,我可以用矢量实现我想要的,v3
但代码似乎有点麻烦。
问题:为什么编译器在编译时不高兴v2
?换句话说,为什么我应该先删除类型引用,然后再添加类型引用reference_wrapper
?
reference_wrapper
实际上并没有“添加引用”。它只是模拟引用语义,但同时允许重新绑定“引用”。无法通过引用重新绑定。std::reference_wrapper
这就是存在的首要原因之一。可以
std::reference_wrapper
为您删除参考吗?是的,它可以执行与您手动执行的操作相同的操作。但是,尝试处理与 不匹配的所有类型std::reference_wrapper
超出了 的范围std::reference_wrapper
。得到编译器错误就“足够好了”。std::reference_wrapper<T>::type
而且,当可能与 不同时,会相当混乱T
。您可以使用
std::ref
: