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

Már*_*ldi 17 c++ c++20

cppreference:

constexpr reference operator[](index_type idx) const;
constexpr reference operator()(index_type idx) const;
Run Code Online (Sandbox Code Playgroud)

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

是有意义的超载operator[]进行索引,作为量程表示的对象可以是指对象的连续序列,但为什么是operator(),该函数调用操作符,也重载用于相同目的?我不相信标准库中有类似的东西.

Nic*_*las 22

那是因为mdspan,一个还未接受多维跨越式,使用operator()索引.毕竟,operator[]只需要一个索引,同时mdspan需要多个索引.

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

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

  • @MárioFeroldi:不; 如果是的话,我们就不需要`mdspan`. (2认同)
  • @einpoklum:是的,但是1D`mdspan`不会是'span`.`span`确保数据是连续的; `mdspan`*不*.`mdspan`可以有跳过元素的迭代器.虽然一个`mdspan`需要紧密包装,但它仍然没有`span`的接口成员(如`data`),因为它基于一个不承担紧密包装的模板.要做你建议的事情就要求1D`msdspan`对1D案例有一个模板专业化,这个专业化基本上就是`span`.重点是什么? (2认同)
  • @einpoklum我听说委员会只是忘了它直到杰克逊维尔才到了,所以他们暂时保留它,而不是把建议拿回来.目的是在C++ 20 IIUC之前删除它 (2认同)
  • @Justin:实际上这似乎是另一个答案. (2认同)

Bau*_*gen 9

相关提案:

span还重载operator()以进行元素访问,以提供与编写的用于对视图进行操作的代码的兼容性.

view已更名为mdspan现在,这尚不规范.

正如在Nicol Bolas的回答中正确指出的那样,mdspan将使用operator()接受多个指数.