以下是最小化的(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 ...
那么,是否有一个晦涩的标准条款禁止第一段代码,或者GCC是否只是崩溃了?