Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 引用一个「;“自动”;函数作为模板参数_C++_Templates_Auto_Compiler Bug - Fatal编程技术网

C++ 引用一个「;“自动”;函数作为模板参数

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

以下是重现该问题的最少(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.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…
最后,Clang很好地编译了我的代码片段


<> P>那么,有没有一个模糊的标准条款禁止第一个片段,或者GCC刚刚死在我身上?< / P > < P>这个行为被推断为一个bug,并已经提交了。< / P >你用C铿尝试过了吗?@库克塞夫特,我在路上尝试它。编辑:这很有效!我用clang(3.5版)和c++1y编译了它,并编译了它。不知道它是否编译正确,但它可以工作:)auto需要一个尾随返回类型,所以它可以工作:static auto value()->void@nilo在开头添加了说明:这是C++14。