Clang:模板演绎失败'double'vs'<double>'</double>

时间:2014-05-12 12:18:52

标签: c++ templates c++11 clang function-templates

考虑以下代码,它使用带有可变参数的函数:

#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<double><double>是否意味着代表一个解压缩的arglist?

更新 icpc 14.0.3不会崩溃,程序会正常编译并运行。

请参阅Intel® Composer XE 2013 SP1 Compilers Fixes List

处的DPD200244439

1 个答案:

答案 0 :(得分:1)

按照上面的讨论,这似乎确实是clang中的一个错误。

正如gha.st所指出的,跳过template using并直接使用本机函数类型:

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

我有一个针对此here提交的错误。