c++ - 引用 "auto"函数作为模板参数

标签 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而不是推论
  • “取消引用”value : template struct Foo<*Foo<bar>::value>;
  • 括号value : template struct Foo<(Foo<bar>::value)>;
  • 制作a指针:template <void (*a)()> struct Foo ...

最后,Clang 可以很好地编译我的代码段。

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

最佳答案

此行为已被推断为错误,并已在 GCC Bugzilla 上归档.

关于c++ - 引用 "auto"函数作为模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31224711/

相关文章:

c++ - c++中的 "int a, b =0"和 "int a =0; int b = 0"有什么区别?

html - 网络应用程序模板

c++ - 迭代 vector 时自动与具体类型?

c++ - C++ 中的卷影复制

c++ - 如何让列表可以隐式转换为我的类对象?

未引用类的 C++ 静态变量

c++ - 具有三元运算符和模板的自动

c++ - "auto function()"可以在函数体内有几种类型的返回吗?

c++ - 如果引用对象是 const,则 const auto & 和 auto & 之间的区别

c++ - static_cast 为不同的类型,并 move 结果