C++ 引用一个「;“自动”;函数作为模板参数
以下是重现该问题的最少(C++14)代码:C++ 引用一个「;“自动”;函数作为模板参数,c++,templates,auto,compiler-bug,C++,Templates,Auto,Compiler Bug,以下是重现该问题的最少(C++14)代码: template <void (&a)()> struct Foo { static auto value() {} }; void bar() {} template struct Foo<Foo<bar>::value>; 模板 结构Foo{ 静态自动值(){} }; 无效条(){} 模板结构Foo; GNUC++ + G+(Ubuntu5.1.0~Ubuntu11~1404.1)5.1
template <void (&a)()>
struct Foo {
static auto value() {}
};
void bar() {}
template struct Foo<Foo<bar>::value>;
模板
结构Foo{
静态自动值(){}
};
无效条(){}
模板结构Foo;
GNUC++ + G+(Ubuntu5.1.0~Ubuntu11~1404.1)5.1.0编译器发出:
error: could not convert template argument ‘Foo<a>::value<bar>’ to ‘void (&)()’
template struct Foo<Foo<bar>::value>;
^
错误:无法将模板参数“Foo::value”转换为“void(&)()”
模板结构Foo;
^
我注意到的第一件奇怪的事情是Foo::value
-a
没有被替换,而value
不知何故成为了一个模板
以下荒谬的修复强化了我的印象,即这是一个编译器错误:
- 将
声明为返回value()
而不是推断它void
- “取消引用”
:值
模板结构Foo代码>
- 插入括号
:值
模板结构Foo代码>
- 使
成为指针:a
template struct Foo…
<> P>那么,有没有一个模糊的标准条款禁止第一个片段,或者GCC刚刚死在我身上?< / P > < P>这个行为被推断为一个bug,并已经提交了。< / P >你用C铿尝试过了吗?@库克塞夫特,我在路上尝试它。编辑:这很有效!我用clang(3.5版)和c++1y编译了它,并编译了它。不知道它是否编译正确,但它可以工作:)auto需要一个尾随返回类型,所以它可以工作:static auto value()->void@nilo在开头添加了说明:这是C++14。