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