template <typename Type, Type Func>
struct A
{
};
void func();
A<void(), func> a; // same result with A<void(), &func> a;
Run Code Online (Sandbox Code Playgroud)
此代码使用Clang(包括最新的8.0.0)进行编译,但不能使用GCC(包括最新的9.1)进行编译。
海湾合作委员会说: error: 'void()' is not a valid type for a template non-type parameter
哪个编译器正确,为什么?
我猜GCC是错误的,因为以下代码在Clang和GCC上都可以编译:
template <void()>
struct A
{
};
void func();
A<func> a; // same result with A<&func> a;
Run Code Online (Sandbox Code Playgroud)
因此,与第一个示例中的GCC报告相反,它void()似乎是“模板非类型参数的有效类型”