std::ranges::size 是否应该返回无符号整数?

fde*_*dev 5 c++ eigen eigen3 c++20 std-ranges

这里写的是std::ranges::size应该返回一个无符号整数。但是,当我在Eigen向量(使用 Eigen 3.4)上使用它时,将进行以下编译:

Eigen::VectorXd x;
static_assert(std::same_as<Eigen::VectorXd::Index,
                           decltype(std::ranges::size(x))>);
Run Code Online (Sandbox Code Playgroud)

其中Eigen::VectorXd::Index是众所周知的有符号整数。通过查看 的实现std::ranges::size,我注意到返回类型是从 的返回类型推断出来的x.size(),这正是Eigen::VectorXd::Index. 这是一个错误吗std::ranges::size?或者这是预期的?


更新 27/12/2021

上面链接的 C++ 参考页最终更改了该函数的描述std::ranges::size:它只返回一个整数,不一定是无符号的!

T.C*_*.C. 7

非常希望这个sized_range概念和相应的ranges::size定制点对已签署/未签署的圣战不采取任何立场。ranges::size当从开始和结束之间的距离计算时,确实会转换为无符号,以与现有标准库保持一致,但用户类型不需要同意该选择。


eer*_*ika 5

\n

这是 std::ranges::size 的错误吗?

\n
\n

不。cppreference 文档具有误导性。不要求std::ranges::size返回无符号整数。在这种情况下,它返回的正是Eigen::VectorXd::size

\n

对于 模型 的范围ranges::sized_range,这将是一个无符号整数,但是Eigen::VectorXd显然不模型这样的范围。

\n
\n

但是与 std::ranges::size 相比,std::ranges::ssize 的目的是什么?

\n
\n

的目的std::ranges::ssize是成为获取有符号值的通用方法,无论std::ranges::size返回有符号还是无符号。在以下情况下它们之间没有区别std::ranges::size在返回有符号类型的

\n
\n

有参考资料来支持你所说的吗?

\n
\n

是的。请参阅 C++ 标准:

\n
\n

[范围.基本尺寸]

\n

否则,如果disable_\xc2\xadsized_\xc2\xadrange<remove_\xc2\xadcv_\xc2\xadt<T>>([range.sized]) 是falseauto(t.size())是类整数类型 ([iterator.concept.winc]) 的有效表达式,ranges\xe2\x80\x8b::\xe2\x80\x8bsize(E)则表达式等价于auto(\xe2\x80\x8bt.size())

\n
\n

  • 公平地说,cppreference 文档只是提到 [`std::ranges::size()`](https://en.cppreference.com/w/cpp/ranges/size#Notes) *"只要范围:: size(e) 对于表达式 e 有效,**返回类型类似于整数**。"*,而 [`std::ranges::ssize()`](https://en.cppreference.com /w/cpp/ranges/ssize#Notes) *"如果 range::ssize(e) 对于表达式 e 有效,**返回类型是有符号整数类型**,即整数类型std::is_signed_v 为 true,或有符号整数类类型。"* (3认同)
  • @Bob__ 是的,这些是准确的。误导性部分位于问题中链接的范围库页面上。 (2认同)