为什么在访问元素之前在容器上使用std :: forward?

时间:2014-12-15 16:49:53

标签: c++ c++14 perfect-forwarding

斯科特迈耶斯在他的新书" Effective Modern C ++"显示以下函数作为使用decltype(auto)的示例(第28页):

template<typename Container, typename Index>
decltype(auto) 
authAndAccess(Container&& c, Index i)
{
  authenticateUser();
  return std::forward<Container>(c)[i];
}

我的问题很简单。为什么我们需要在std::forward申请c?我们没有将c传递到任何地方,我们正在调用operator[]。并且没有一个标准容器具有operator[]的ref-qualified重载(r值/ l值重载)。

所以我认为只有两个原因std::forward

  1. 考虑潜在的容器,这些容器实现了operator[]的ref-qualified重载。
  2. 为了保持一致性:每当使用声明为转发(通用)引用的变量时,在其上应用std::forward。周期。
  3. 还有其他原因吗?

1 个答案:

答案 0 :(得分:8)

原因#1是相关的。当你实现一个通用函数时,你不会通过“我知道这些特定类型做什么?”,而是通过“我对我正在使用的通用内容了解多少?”。

通用容器没有提及参考资格,所以你转发。

当然,理由#2更容易记住和推理,所以你应该遵循它。

我认为没有其他原因。