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:它只返回一个整数,不一定是无符号的!
非常希望这个sized_range概念和相应的ranges::size定制点对已签署/未签署的圣战不采取任何立场。ranges::size当从开始和结束之间的距离计算时,确实会转换为无符号,以与现有标准库保持一致,但用户类型不需要同意该选择。
\n\n这是 std::ranges::size 的错误吗?
\n
不。cppreference 文档具有误导性。不要求std::ranges::size返回无符号整数。在这种情况下,它返回的正是Eigen::VectorXd::size。
对于 模型 的范围ranges::sized_range,这将是一个无符号整数,但是Eigen::VectorXd显然不模型这样的范围。
\n\n但是与 std::ranges::size 相比,std::ranges::ssize 的目的是什么?
\n
的目的std::ranges::ssize是成为获取有符号值的通用方法,无论std::ranges::size返回有符号还是无符号。在以下情况下它们之间没有区别std::ranges::size在返回有符号类型的
\n\n有参考资料来支持你所说的吗?
\n
是的。请参阅 C++ 标准:
\n\n\n[范围.基本尺寸]
\n否则,如果
\ndisable_\xc2\xadsized_\xc2\xadrange<remove_\xc2\xadcv_\xc2\xadt<T>>([range.sized]) 是false且auto(t.size())是类整数类型 ([iterator.concept.winc]) 的有效表达式,ranges\xe2\x80\x8b::\xe2\x80\x8bsize(E)则表达式等价于auto(\xe2\x80\x8bt.size())。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |