Поскольку мне пришлось написать код, совместимый с C ++ 14, где я все еще хотел использовать std::is_invocable
в шаблоне, я попытался использовать boost::callable_traits::is_invocable
. Однако, хотя boost::callable_traits::is_invocable
вернул аналогичные результаты, boost::callable_traits::is_invocable_v
не вернул.
Вот простой пример поведения:
#include <iostream>
#include <boost/callable_traits.hpp>
#include <type_traits>
#include <boost/version.hpp>
int test(int){
return 0;
}
int main()
{
std::cout << "Boost version: " << BOOST_LIB_VERSION << std::endl;
std::cout<< "boost::callable_traits::is_invocable_v: "
<< boost::callable_traits::is_invocable_v<decltype(test), int> << std::endl;
std::cout<< "boost::callable_traits::is_invocable: "
<< boost::callable_traits::is_invocable<decltype(test), int>::value << std::endl;
std::cout<< "std::is_invocable_v: "
<< std::is_invocable_v<decltype(test), int> << std::endl;
std::cout<< "std::is_invocable: "
<< std::is_invocable<decltype(test), int>::value << std::endl;
return 0;
}
Результат:
Boost version: 1_72
boost::callable_traits::is_invocable_v: 0
boost::callable_traits::is_invocable: 1
std::is_invocable_v: 1
std::is_invocable: 1
Я загрузил код также в wandbox .
В чем причина такого удивительного поведения?