В некоторых случаях, см. Один пример ниже, std::is_floating_point
возвращает false
для float
.
#include <iostream>
#include <type_traits>
#include <vector>
int main()
{
::std::cout << typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])).name() << ::std::endl;
if (::std::is_floating_point< decltype(::std::vector< float >()[::std::vector< float >().size()]) >::value)
{
::std::cout << "floating point" << ::std::endl;
}
else
{
::std::cout << "not floating point" << ::std::endl;
}
return 0;
}
Выход из GCC
f
not floating point
В этом примере можно видеть, что typeid
рассматривает ::std::vector< float >()[::std::vector< float >().size()]
как float
поскольку возвращает правильное имя. Также можно проверить, что typeid(decltype(::std::vector< float >()[::std::vector< float >().size()])) == typeid(flat)
возвращает true
. Однако std::is_floating_point
возвращает false. Зачем? Это ошибка от C++?
FYI, я проверил как с GCC, так и с VisualStudio. В этом примере я использовал std :: vector, но можно также попробовать другие библиотеки, такие как Eigen.