左引用的reference_wrapper

问题描述 投票:0回答:1

在下面的代码中,我尝试使用由类型引用组成的向量

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
添加类型引用?

c++ reference type-traits
1个回答
2
投票

换句话说,为什么我应该先删除类型引用,然后再使用 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;
}
© www.soinside.com 2019 - 2024. All rights reserved.