Betrachten Sie den folgenden Code fehlgeschlagen ist, die eine Funktion mit variabler Argumente verwendet:Clang: Template Abzug 'double' vs '<double>'
#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);
}
diese Kompilieren mit g ++ 4.7.3 funktioniert gut, und Laufen erzeugt 1024.0
als erwartet.
mit Kompilieren icpc 14.0.2 stürzt ...
templ.cc(21): internal error: assertion failed: lower_expr: bad kind (shared/cfe/edgcpfe/lower_il.c, line 18582)
run_func(f, &value);
^
mit Klirren Kompilieren 3.5.0-1 gibt die folgende Fehlermeldung:
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) {
^
Ist das ein Bug, oder sollte habe g ++ das nicht kompiliert?
Warum ist klirrt diese „widersprüchlichen“ Arten von double
und <double>
herzuleiten ist <double>
bedeutet eine entpackte arglist zum Beispiel zu vertreten?
Update Icpc 14.0.3 stürzt nicht ab, und das Programm kompiliert und läuft korrekt.
See DPD200244439 bei Intel® Composer XE 2013 SP1 Compilers Fixes List
Ihre letzte Frage, die Sie selbst beantworten konnten, indem Sie run_func (f, & value, & value) übergeben ... was zu führt, was ich nicht für richtig halte ... Sie könnten es mit einem mehr versuchen recent clang von svn, es riecht nach einem Bug –
PlasmaHH
Da das Ersetzen der 'template using' durch den nativen Typ das Problem verschwinden lässt, fühlt es sich sehr nach einem Bug an. –
@PlasmaHH Ich versuchte kling Version 3.5.0 (Stamm 208562), das gleiche Problem! – WaelJ