Một phạm vi dựa trên for
tuyên bố được định nghĩa trong §6.5.4 là tương đương với:Tại sao một tuyên bố dựa trên dải ô có phạm vi bằng tự động &&?
{
auto && __range = range-init;
for (auto __begin = begin-expr,
__end = end-expr;
__begin != __end;
++__begin) {
for-range-declaration = *__begin;
statement
}
}
nơi range-init
được định nghĩa cho hai hình thức phạm vi dựa trên for
như:
for (for-range-declaration : expression) => (expression)
for (for-range-declaration : braced-init-list) => braced-init-list
(điều khoản tiếp tục xác định ý nghĩa của các biểu thức con khác)
Tại sao là __range
e loại suy luận auto&&
? Sự hiểu biết của tôi về auto&&
là nó hữu ích cho việc bảo quản giá trị ban đầu (lvalue/rvalue) của một biểu thức bằng cách chuyển nó qua std::forward
. Tuy nhiên, __range
không được chuyển qua bất kỳ đâu qua std::forward
. Chỉ được sử dụng khi nhận các trình vòng lặp phạm vi, là một trong số __range
, __range.begin()
hoặc begin(__range)
.
Lợi ích ở đây khi sử dụng "tham chiếu chung" auto&&
là gì? Sẽ không auto&
đủ?
Lưu ý: Theo như tôi có thể biết, the proposal không nói bất cứ điều gì về lựa chọn auto&&
.
Bằng cách này bạn có thể sử dụng giá trị r trong phạm vi. –
"* Theo như tôi có thể nói, đề xuất không nói bất cứ điều gì về lựa chọn tự động &&. *" Và đề xuất đó cũng sử dụng thư viện phạm vi, không tồn tại trong C++ 11. –
Để tham khảo trong tương lai, thuộc tính của một biểu thức được mô tả bằng ví dụ: 'lvalue' hoặc 'rvalue' là danh mục giá trị của nó. –