请考虑以下代码。 这是我面临的问题的简化案例。
#include <type_traits>
#include <iostream>
#ifdef _MSC_VER
__declspec(noreturn) void f();
#else
void f() __attribute__((noreturn));
#endif
[[noreturn]] void g();
void h();
template<typename T>
struct is_func_ptr : std::false_type {};
template<typename T, typename... Ts>
struct is_func_ptr<T(*)(Ts...)> : std::true_type {};
int main()
{
std::cout << is_func_ptr<decltype(&f)>::value << '';
std::cout << is_func_ptr<decltype(&g)>::value << '';
std::cout << is_func_ptr<decltype(&h)>::value << '';
return 0;
}
GCC和MSVC产生相同的输出:
1 1 1
虽然在-fms-extentions和-fno-ms-extensions模式下Clang(在3.8和3.9上测试)不同意:
0 1 1
此行为是否适用于非标准属性?在函数指针上正确地专门化模板有什么变通方法(这样会暴露返回类型和参数类型)?