gpt4 book ai didi

c++ std::forward 在容器上调用 operator[]

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:00:44 25 4
gpt4 key购买 nike

《Effective modern C++》一书中第3条写了这样一段代码:

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

我不明白你为什么调用std::forward?如果 c 是右值引用,那么在右值而不是左值上调用 operator[] 会发生什么变化?对我来说 c[i] 应该足够了。

PS:当变量是函数的参数时,我理解 std::forward 的目的是:

template<typename T, typename... Ts>
std::unique_ptr<T> make_unique(Ts&&... params)
{
return std::unique_ptr<T>(new T(std::forward<Ts>(params)...));
}

最佳答案

Container 的 operator[] 可能已经为右值和左值重载了。

auto Container::opeartor[](int i) && -> Container::value_type&;
auto Container::opeartor[](int i) & -> Container::value_type&;

如果是这样,我们要确保如果 c 是用右值初始化的,我们会在 c 上调用 operator[] 的右值版本。重载 operator[] 使左值和右值的行为不同当然不常见,但这是可能的,因此在真正的通用代码中,我们需要在将它转发给 operator[] 之前将 std::forward 应用于 c。

关于c++ std::forward 在容器上调用 operator[],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36242131/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com