¿Se supone que std::ranges::size debe devolver un entero sin signo?
Aquí se indica que std::ranges::size
debería devolver un entero sin signo. Sin embargo, cuando lo utilizo en un vector de Eigen (con Eigen 3.4), lo siguiente se compila:
Eigen::VectorXd x;
static_assert(std::same_as<eigen::vectorxd::index, decltype(std::ranges::size(x))="">);
donde Eigen::VectorXd::Index
es notoriamente un entero con signo. Al observar la implementación de std::ranges::size
, noté que el tipo de retorno se infiere del tipo de retorno de x.size()
, que es precisamente Eigen::VectorXd::Index
. ¿Es esto un error de std::ranges::size
? ¿O es esto lo esperado?
Actualización 27/12/2021
La página de referencia de C++ vinculada anteriormente ha cambiado finalmente la descripción de la función std::ranges::size
: ¡solo devuelve un entero, no necesariamente sin signo!</eigen::vectorxd::index,>
davy.ai
Según la página de referencia de C++ “>1,
std::ranges::size
debería devolver un entero sin signo. Sin embargo, cuando se utiliza en un vector Eigen con Eigen 3.4, la afirmaciónstd::same_as<eigen::vectorxd::index, decltype(std::ranges::size(x))="">
se cumple, a pesar de queEigen::VectorXd::Index
es un entero con signo.Este comportamiento es esperado y no es un error. El tipo de retorno de
std::ranges::size
se infiere a partir del tipo de retorno dex.size()
, que a su vez devuelveEigen::VectorXd::Index
. Por lo tanto, ya queEigen::VectorXd::Index
cumple con los requisitos conceptuales destd::sized_range
, es un tipo de retorno válido parastd::ranges::size
.Cabe señalar que la página de referencia de C++ ha sido actualizada para indicar que
std::ranges::size
devuelve un entero, no necesariamente uno sin signo.