在下面的代码中,我尝试使用由类型引用组成的向量
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 添加类型引用?
reference_wrapper
实际上并没有“添加引用”。它只是模拟引用语义,但同时允许重新绑定“引用”。无法通过引用重新绑定。这就是 std::reference_wrapper
存在的第一个原因。
可以
std::reference_wrapper
为您删除参考吗?是的,它可以执行与您手动执行的操作相同的操作。但是,尝试处理与 std::reference_wrapper
不匹配的所有类型超出了 std::reference_wrapper
的范围。得到编译器错误就“足够好了”。此外,当 std::reference_wrapper<T>::type
与 T
不同时,会很混乱。
您可以使用
std::ref
:
#include <string>
#include <vector>
int main (int argc, char* argv[])
{
std::string object ("foobar");
std::string& refobj = object;
std::vector<decltype(std::ref(refobj))> v3;
}