为什么std :: span重载函数调用运算符以进行索引?

时间:2018-04-29 16:49:00

标签: c++ c++20

来自cppreference

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

返回对序列的idx - 元素的引用。该   如果idx超出范围(即,如果它更小,则行为未定义)   大于零或大于或等于size())。

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

2 个答案:

答案 0 :(得分:23)

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

因此,为了让这两种类型具有尽可能相似的界面,span也允许operator()

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

答案 1 :(得分:9)

来自relevant proposal

  

跨度也超载   运算符()    用于元素访问,以提供与写入代码的兼容性   反对   图。

目前view已重命名为mdspan,尚未标准化。

正如Nicol Bolas'回答,mdspan将使用operator()接受多个索引。