Xét đoạn mã sau, trong đó sử dụng một hàm với đối số biến:Clang: Mẫu khấu trừ thất bại 'đúp' 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);
}
Biên dịch này với g ++ 4.7.3 hoạt động tốt, và chạy sản xuất 1024.0
như kỳ vọng.
Biên soạn bằng 14.0.2 ICPC treo nó ...
templ.cc(21): internal error: assertion failed: lower_expr: bad kind (shared/cfe/edgcpfe/lower_il.c, line 18582)
run_func(f, &value);
^
Biên soạn với kêu vang 3.5.0-1 cung cấp cho các thông báo lỗi sau:
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) {
^
Đây có phải là một lỗi, hoặc nên có g ++ không biên dịch này?
Tại sao clang suy ra các loại "xung đột" này là double
và <double>
, là <double>
có nghĩa là đại diện cho một danh sách lập trình chưa được giải nén chẳng hạn?
Cập nhật icpc 14.0.3 không bị lỗi và chương trình biên dịch và chạy chính xác.
Xem DPD200244439 tại Intel® Composer XE 2013 SP1 Compilers Fixes List
Câu hỏi cuối cùng bạn có thể tự trả lời bằng cách chuyển run_func (f, & value & & value) ... kết quả là mà tôi không nghĩ là chính xác ... bạn có thể muốn thử nhiều hơn clang gần đây từ svn, nó có mùi giống như một lỗi –
PlasmaHH
Vì việc thay thế 'mẫu sử dụng' với kiểu gốc làm cho vấn đề biến mất, nó cảm thấy rất giống một lỗi. –
@PlasmaHH Tôi đã thử phiên bản tiếng kêu 3.5.0 (thân 208562), cùng một vấn đề! – WaelJ