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++ - 为什么 auto 将这个变量推导出为 double 而不是 float?

c++ - 编译一个 MSVC++2010 项目使其可以在 Ubuntu 上运行

c++ - 在 Qt 中缩放图形

c++ - 大阶乘系列

c++ - 如何将参数列表存储到 vector ?

php - 适用于某些内容类型的 Drupal 7 自定义模板文件

子模板中的 C++ 模板特化

c++ - `auto` 和 `std::any` 有什么区别?

c++ - 有没有办法自动类型转换 void 指针?

c++ - 为什么我的代码在没有 chroot 功能的情况下工作,但在 chroot 功能下却失败了?