为什么 std::span 会重载用于索引的函数调用运算符?

Why does std::span overload the function call operator for indexing?

编辑:这个重载现在似乎已经从标准中删除了。

来自cppreference

constexpr reference operator[](index_type idx) const;
constexpr reference operator()(index_type idx) const;

Returns a reference to the idx-th element of the sequence. The behavior is undefined if idx is out of range (i.e., if it is less than zero or greater than or equal to size()).

为索引重载 operator[] 是有意义的,因为跨度表示一个对象,可以引用连续的对象序列,但为什么 operator()function call operator,也为了同样的目的超载?我不相信标准库中有类似的东西。

它在那里是因为 mdspana not-yet-accepted multi-dimensional span type 使用 operator() 进行索引。毕竟operator[]只取一个索引,而mdspan需要多个索引。

所以为了让这两个类型有尽可能相似的接口,span也允许operator().

请注意,使用 operator() 是 C++ 中用于多维索引的常见约定。 Eigen 和 Boost 都使用它,许多其他人也使用它。

来自relevant proposal

span also overloads operator() for element access, to provide compatibility with code written to operate against view.

目前view已经重命名为mdspan,尚未规范

正如 Nicol Bolas 的回答中正确指出的那样,mdspan 将使用 operator() 来接受多个索引。