template <typename Type, Type Func>
struct A
{
};

void func();

A<void(), func> a; // same result with A<void(), &func> a;

此代码使用Clang(包括最新的8.0.0)进行编译,但不能使用GCC(包括最新的9.1)进行编译。

GCC说: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;

因此,与GCC在第一个示例中报告的相反,void()似乎是“模板非类型参数的有效类型”

最佳答案

function parameter type相似,如果非类型模板参数的类型是函数类型,则将其调整为指向函数类型[temp.param]/8的指针:



所以c是正确的。 GCC错误报告已存在bug #82773

只有c++标准的当前工作草案才能将模板参数substitution识别为以下模板参数的过程。因此,可以说该标准尚不明确,因为它没有指定在每个替换之后都进行类型调整。

09-10 05:24
查看更多