引用“自动”功能作为模板参数

时间:2015-07-04 20:07:17

标签: c++ templates auto compiler-bug

以下是重现此问题的最小(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而不是推断
  • “取消引用”valuetemplate struct Foo<*Foo<bar>::value>;
  • 使用括号valuetemplate struct Foo<(Foo<bar>::value)>;
  • 使a成为指针:template <void (*a)()> struct Foo ...

最后,Clang将我的片段编译好。

那么,某个禁止第一个片段的地方是否有一个模糊的标准条款,或者GCC刚刚死在我身上?

1 个答案:

答案 0 :(得分:0)

此行为已被推断为错误,已在GCC Bugzilla上提交。