Initializer danh sách biểu thức là thực sự thuận tiện cho việc khởi tạo C++ container:Forwarding danh sách initializer biểu thức
std::vector<int>({1, 2, 3})
... nhưng có vẻ như một biểu hiện danh sách initializer cú đúp kín, giống như {1,2,3}
sẽ chỉ bám vào một chức năng mà phải mất một std::initializer_list<int>
- nó không dường như liên kết với một phổ quát (chuyển tiếp) tham khảo:
template <class T>
void foo(T&& v)
{
std::vector<int>(std::forward<T>(v));
}
int main()
{
foo({1, 2, 3})
}
đầu ra này:
test2.cpp:11:6: note: template<class U> void foo(U&&)
test2.cpp:11:6: note: template argument deduction/substitution failed:
test2.cpp:33:13: note: couldn't deduce template parameter ‘U’
(Đây là kết quả với GCC 4.7.2.)
này không may có nghĩa là chúng ta không thể chuyển tiếp một biểu danh sách initializer. Vì nó sẽ rất thuận tiện để làm điều đó, tôi muốn hỏi tại sao nó không hoạt động? Tại sao không thể có một biểu thức danh sách khởi tạo kèm cặp ngoặc đơn liên kết với tham chiếu chuyển tiếp? Hoặc là điều này được cho phép, và có lẽ trình biên dịch của tôi chỉ là quá cũ?
Không sử dụng để chuyển tiếp một 'initializer_list': Nó đã có ngữ nghĩa tham chiếu, và các phần tử của nó là const, do đó không thể di chuyển được. – dyp
Không quan trọng nếu chúng di chuyển được - một tham chiếu chuyển tiếp phổ quát không nhất thiết ngụ ý di chuyển, nó chỉ ngụ ý chuyển tiếp dọc theo tham số là – Siler
Có, nhưng một danh sách-init-brace không có kiểu. Do đó, bạn không thể chuyển tiếp nó "as-is". – dyp