Hãy xem xét các chức năng:initializer_list và kiểu mẫu trích
template<typename T>
void printme(T&& t) {
for (auto i : t)
std::cout << i;
}
hay bất kỳ chức năng khác mà hy vọng một tham số với một bắt đầu()/end() - cho phép loại.
Tại sao điều sau đây là bất hợp pháp?
printme({'a', 'b', 'c'});
Khi tất cả đều là chính đáng:
printme(std::vector<char>({'a', 'b', 'c'}));
printme(std::string("abc"));
printme(std::array<char, 3> {'a', 'b', 'c'});
Chúng tôi thậm chí có thể viết này:
const auto il = {'a', 'b', 'c'};
printme(il);
hoặc
printme<std::initializer_list<char>>({'a', 'b', 'c'});
+1 Tôi đã học được điều gì đó. nâng cao 'std :: initialiser_list <>' thành một hàm ngoài một hàm thư viện thông thường. – Walter
Chỉ để hoàn thành. Đây là một cách để giải quyết vấn đề: http://pastebin.com/huEGwnDt – 4ZM
Chúng ta có biết * tại sao * đây là trường hợp? Nó có vẻ khá lạ đối với tôi rằng nếu tôi muốn cho phép một hàm mẫu (có thể là một thuật toán dựa trên phạm vi) để lấy một đối số danh sách khởi tạo, tôi phải cung cấp quá tải cho 'std :: initializer_list'. –