std::array<std::array<T, N2>、N> 数据成员上的括号运算符重载

Brackets operator overload on std::array<std::array<T, N2>, N> data member

因此,请考虑以下代码:

#include <iostream>
#include <array>

template<class T, std::size_t N, std::size_t N2>
struct foo
{
    std::array<std::array<T, N2>, N> data;

    T& operator[](std::size_t index) { return data[index]; }
};

int main()
{
    foo<int, 3, 3> obj;
    std::cout << obj[2][2]; //boom
}

这是我的逻辑: obj[2] 本身 returns 是一个 std::array<T, N2> 对象,因此再次将 operator[] 应用于该对象 (obj[2][2]),应该会得到我需要的结果。所以实际上 obj[2] 是调用 foooperator[],而 obj[2][2] 是调用 std::array<T, N>operator[]。明显不是。

问题:上面的例子是怎么回事,为什么我的逻辑有问题?

看看你的operator[]。它 returns T&,在你的情况下是 int&。另一方面,data[index]std::array<T, N2>& 类型,在本例中是 std::array<int, 3>&.

更改运算符的 return 类型应该可以解决此问题:

    std::array<T, N2>& operator[](std::size_t index) { return data[index]; }

operator[]的return类型不对。表达式 data[index] 属于 std::array<T, N2> 类型,您告诉编译器您 return 一个 T&,这是错误的。您的函数应如下所示:

std::array<T, N2>& operator[](std::size_t index) { return data[index]; }