以下是重现此问题的最小(C ++ 14)代码:
template <void (&a)()>
struct Foo {
static auto value() {}
};
void bar() {}
template struct Foo<Foo<bar>::value>;
GNU C ++ “g ++(Ubuntu 5.1.0-0ubuntu11~14.04.1)5.1.0”编译器发出:
error: could not convert template argument ‘Foo<a>::value<bar>’ to ‘void (&)()’
template struct Foo<Foo<bar>::value>;
^
我注意到的第一个奇怪的事情是Foo<a>::value<bar>
- a
未被替换,value
以某种方式成为模板?
以下无意义的修复增强了我的印象,即这是一个编译器错误:
value()
返回void
而不是推断value
:template struct Foo<*Foo<bar>::value>;
value
:template struct Foo<(Foo<bar>::value)>;
a
成为指针:template <void (*a)()> struct Foo ...
最后,Clang将我的片段编译好。
那么,某个禁止第一个片段的地方是否有一个模糊的标准条款,或者GCC刚刚死在我身上?