为什么 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,也为了同样的目的超载?我不相信标准库中有类似的东西。
它在那里是因为 mdspan
、a not-yet-accepted multi-dimensional span type 使用 operator()
进行索引。毕竟operator[]
只取一个索引,而mdspan
需要多个索引。
所以为了让这两个类型有尽可能相似的接口,span
也允许operator()
.
请注意,使用 operator()
是 C++ 中用于多维索引的常见约定。 Eigen 和 Boost 都使用它,许多其他人也使用它。
span also overloads
operator()
for element access, to provide compatibility with code written to
operate against
view.
目前view
已经重命名为mdspan
,尚未规范
正如 Nicol Bolas 的回答中正确指出的那样,mdspan
将使用 operator()
来接受多个索引。
编辑:这个重载现在似乎已经从标准中删除了。
来自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 ifidx
is out of range (i.e., if it is less than zero or greater than or equal tosize()
).
为索引重载 operator[]
是有意义的,因为跨度表示一个对象,可以引用连续的对象序列,但为什么 operator()
,function call operator,也为了同样的目的超载?我不相信标准库中有类似的东西。
它在那里是因为 mdspan
、a not-yet-accepted multi-dimensional span type 使用 operator()
进行索引。毕竟operator[]
只取一个索引,而mdspan
需要多个索引。
所以为了让这两个类型有尽可能相似的接口,span
也允许operator()
.
请注意,使用 operator()
是 C++ 中用于多维索引的常见约定。 Eigen 和 Boost 都使用它,许多其他人也使用它。
span also overloads operator() for element access, to provide compatibility with code written to operate against view.
目前view
已经重命名为mdspan
,尚未规范
正如 Nicol Bolas 的回答中正确指出的那样,mdspan
将使用 operator()
来接受多个索引。