Я хочу проверить, существует ли функция, не являющаяся членом, которая принимает тип параметра Т. Для этого я использовал void_t
"трюк", представленный г-ном Вальтером Э. Брауном в cppcon (тот же трюк работает без каких-либо проблем, чтобы проверить, существует ли тип члена или функция-член).
#include <iostream>
#include <type_traits>
template<typename...>
using void_t = void;
void Serialize(float&)
{
}
template<typename T, typename = void>
struct has_external_serialize : std::false_type
{
};
template<typename T>
struct has_external_serialize<T, void_t<decltype(Serialize(std::declval<T&>()))>> : std::true_type
{
};
void Serialize(int&)
{
}
int main(int argc, const char * argv[])
{
std::cout<<has_external_serialize<float>::value<<has_external_serialize<int>::value;
}
Этот код печатает 11
при компиляции с использованием GCC и 10
при компиляции с помощью clang (xcode 5.1.1).
Мои вопросы - этот код правильный? Если да, есть ли ошибка в clang или ошибка в GCC или код находится в определенной области, определенной для реализации, и я не могу предположить, что он будет иметь такое же поведение на всех платформах?