Clang:模板推导失败 'double' vs '<double>'。 (注:这是一个提问标题,无需回答。)

10
考虑以下代码,它使用具有可变参数的函数:
#include <iostream>

// Typedef function type
template<typename... Output>
using Func = void(Output*...);

// Function runner
template<typename... Output>
void run_func(Func<Output...>& func, Output*... output) {
  for (int i=0 ; i < 10 ; ++i) {
    func(output...);
  }
}

void f(double* d) {
  *d *= 2;
};

int main() {
  double value = 1.0;
  run_func(f, &value);
  printf("%f\n", value);
}

使用 g++ 4.7.3 编译此代码没有问题,运行后会生成预期的结果 1024.0

但是如果使用 icpc 14.0.2 编译,则会导致程序崩溃...

templ.cc(21): internal error: assertion failed: lower_expr: bad kind (shared/cfe/edgcpfe/lower_il.c, line 18582)

    run_func(f, &value);
    ^

使用clang 3.5.0-1编译会导致以下错误消息:

templ.cc:21:3: error: no matching function for call to 'run_func'
  run_func(f, &value);
  ^~~~~~~~
templ.cc:9:6: note: candidate template ignored: deduced conflicting types for parameter 'Output' ('double' vs. <double>)
void run_func(Func<Output...>& func, Output*... output) {
     ^

这是一个错误吗?还是说g++不应该编译这个?

为什么clang会推断出这些“冲突”的类型,例如<double>是否表示未打包的参数列表?

更新 icpc 14.0.3没有崩溃,程序可以正确编译和运行。

请参阅Intel® Composer XE 2013 SP1编译器修复列表中的DPD200244439


你最后一个问题可以通过传递run_func(f,&value,&value)来自己回答...这将导致<double,double>,我认为这不正确...你可能想尝试使用来自svn的更近期的clang,它看起来像是一个bug。 - PlasmaHH
6
由于将“template using”替换为本地类型可以消除问题,因此感觉非常像一个bug。 - danielschemmel
@PlasmaHH 我尝试了clang版本3.5.0(trunk 208562),问题依旧! - WaelJ
1
@WaelJ:在这种情况下,我建议您向Clang团队报告错误。3.5即将发布,如果他们能在发布前解决这个问题,那就太棒了。 - Matthieu M.
@WaelJ请将您的更新发布为答案并接受它,以将问题从未回答列表中移除。 - AliciaBytes
显示剩余2条评论
1个回答

1

根据以上讨论,似乎这确实是clang的一个bug。

正如gha.st所指出的那样,跳过template using并直接使用本地函数类型可以解决问题:

void run_func(void (&func)(Output*...), Output*... output) {

我已经对这个这里提出了一个错误报告。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接