属性作为Clang

时间:2016-10-20 10:24:50

标签: c++ attributes clang++

请考虑以下代码。 这是我面临的问题的简化案例。

#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

此行为是否适用于非标准属性?在函数指针上正确地专门化模板有什么变通方法(这样会暴露返回类型和参数类型)?

0 个答案:

没有答案