В некоторых случаях, см. пример ниже, 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++?
К вашему сведению, я проверил как с помощью GCC, так и с VisualStudio. В этом примере я использовал std::vector, но можно попробовать и другие библиотеки, например Eigen.
decltype
— это функция времени компиляции, так какstd::vector< float >()
создает пустой вектор, где даже индекс0
выходит за границы, и в противном случае приводит к неопределенное поведение. - person Some programmer dude   schedule 12.09.2018declval
, чтобы быть в полной безопасности. Даже не требует ctor по умолчанию. - person MSalters   schedule 12.09.2018std::istream
). - person Arne Vogel   schedule 12.09.2018