推导的返回类型

Deduced Return Type

本文关键字:返回类型      更新时间:2023-10-16
#include <iostream>
#include <vector>
template<typename Container, typename Index>
decltype(auto)
foo(Container&& c, Index i) {
    return std::forward<Container>(c)[i];
}
template<typename Container, typename Index>
decltype(auto)
bar(Container&& c, Index i) {
    return c[i];
}
int main() {
    std::vector<uint32_t> q{1, 3, 5};
    std::vector<uint32_t> r{2, 4, 6};
    std::cout << "lvalue" << std::endl;
    std::cout << foo(q, 1) << std::endl;
    std::cout << bar(q, 1) << std::endl;
    std::cout << "rvalue" << std::endl;
    std::cout << foo(std::move(q), 1) << std::endl;
    std::cout << bar(std::move(r), 1) << std::endl;
}

foo()bar()的返回类型有什么区别?

std::forward<Container>(c)只是保持其"原始"类型。它如何影响转弯类型?在我看来,当c是RVALUE参考时,std::forward<Container>(c)[i]仍然返回对第i-th元素的引用。当c是LVALUE参考时,std::forward<Container>(c)[i]仍然返回对第i-th元素的参考。

我敢肯定我想念一些东西。

std::vector::operator[]对于rvalue而言没有超载。因此,就您而言,没有任何更改。

但对于类似:

的课程
template <typename T>
struct S
{
    T operator [](std::size_t) &&;
    T& operator [](std::size_t) &;
    // ...
};

这会有所作为。