作为模板参数引用“auto”函数

6

以下是最小化的(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>;
  • value加上括号:template struct Foo<(Foo<bar>::value)>;
  • a变成指针:template <void (*a)()> struct Foo ...
最后,Clang对我的代码片段进行了很好的编译。
那么,是否有一个晦涩的标准条款禁止第一段代码,或者GCC是否只是崩溃了?

你是否尝试使用clang了? - hellow
@cookiesoft 我正在尝试中。编辑:它可以用! - Quentin
我使用clang(版本3.5)和c++1y编译了它,而且它已经编译成功了。虽然不知道是否编译正确,但是它可以正常工作 :) - hellow
auto需要一个尾随返回类型,因此这将起作用:static auto value()->void - user2946316
@nilo 在开头添加了澄清:这是C++14。 - Quentin
1个回答

0

这种行为已被推断为一个错误,并已在GCC Bugzilla上进行了记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接