2017-03-23 44 views
8

Tôi muốn sử dụng một bí danh của std::initializer_list thay vì bản thân như thế:Bí danh std :: initializer_list trong vang

#include<initializer_list> 

template< typename T > 
using InitializerList = std::initializer_list<T>; 

// note: candidate template ignored: couldn't infer template argument 'T' 
template< typename T > 
void f(InitializerList<T> list) { 
} 

int main() { 
    // error: no matching function for call to 'f' 
    f({1, 2, 3, 4, 5}); 
} 

Đó là mã là tốt sử dụng gcc & cl. Tuy nhiên, khi sử dụng tiếng kêu, tôi gặp lỗi:

<source>:11:3: error: no matching function for call to 'f' 
    f({1, 2, 3, 4, 5}); 
^
<source>:7:6: note: candidate template ignored: couldn't infer template argument 'T' 
void f(InitializerList<T> list) { 
    ^
1 error generated. 

Nhưng việc sử dụng trực tiếp std::initializer_list không bị lỗi.

#include<initializer_list> 

template< typename T > 
void f(std::initializer_list<T> list) { 
} 

int main() { 
    f({1, 2, 3, 4, 5}); 
} 

Tôi đã thử tất cả các phiên bản của vang từ 3.4.2 để 4.0.0 và nhận được kết quả tương tự. Hành vi của cào có đạt tiêu chuẩn không?

+2

Nó biên dịch tốt với 'gcc 6.3' (http://ideone.com/pQir1C). Nó là một lỗi trong clang imho. – Jonas

+6

Có một [lỗi Clang] (https://bugs.llvm.org//show_bug.cgi?id=23689) về việc này. – TartanLlama

Trả lời

Các vấn đề liên quan