2012-11-05 37 views
14

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&&.

+1

Bằng cách này bạn có thể sử dụng giá trị r trong phạm vi. –

+0

"* 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. –

+2

Để 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ó. –

Trả lời

16

Sẽ không tự động & đủ?

Không, không. Nó sẽ không cho phép sử dụng biểu thức giá trị r giá trị tính toán phạm vi. auto&& được sử dụng bởi vì nó có thể liên kết với một biểu thức l-giá trị hoặc một biểu thức giá trị r. Vì vậy, bạn không cần phải gắn phạm vi vào một biến để làm cho nó hoạt động.

Hoặc, nói cách khác, điều này sẽ không thể thực hiện:

for(const auto &v : std::vector<int>{1, 43, 5, 2, 4}) 
{ 
} 

Sẽ không phải const auto& đủ?

Không, không. A const std::vector sẽ chỉ trả lại const_iterator giây về nội dung của nó. Nếu bạn muốn thực hiện việc chuyển đổi không theo số const qua nội dung, điều đó sẽ không hữu ích.

+0

Rất tiếc, tôi thực sự muốn hỏi liệu 'const auto &' có đủ không. Liệu điều này cũng không ràng buộc với bất cứ điều gì? –

+0

@sftrabbit: Nó sẽ không liên kết với giá trị * non-const * l. 'Const std :: vector' sẽ chỉ trả về các biến lặp' const'. –

+0

Cảm ơn. Điều này có nghĩa là 'auto &&' cũng hữu ích cho việc liên kết với bất kỳ thứ gì mà không làm cho nó 'const', ngoài việc chuyển tiếp. –

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