引用 "auto" 函数作为模板参数
Reference to an "auto" function as a template parameter
这是重现问题的最少 (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
而不是推导它
- "Dereferencing"
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++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
而不是推导它 - "Dereferencing"
value
:template struct Foo<*Foo<bar>::value>;
- 括号
value
:template struct Foo<(Foo<bar>::value)>;
- 制作
a
指针:template <void (*a)()> struct Foo ...
最后,Clang 编译了我的代码片段。
那么,是否有一个模糊的标准条款禁止第一个片段,或者 GCC 刚刚死在我身上?
此行为已被推断为错误,并已在 GCC Bugzilla 上归档。