2016-07-18 30 views
6

Tôi muốn chuyển một giá trị đơn lẻ đến một hàm dự kiến ​​một cặp vòng lặp và cho nó hoạt động như thể tôi đã chuyển một cặp vòng lặp tới một phạm vi chỉ chứa giá trị này.Lặp lại một giá trị duy nhất

cách tiếp cận của tôi là như sau:

#include <iostream> 
#include <vector> 

template<typename Iter> 
void iterate_over(Iter begin, Iter end){ 
    for(auto i = begin; i != end; ++i){ 
     std::cout << *i << std::endl; 
    } 
} 

int main(){ 
    std::vector<int> a{1,2,3,4}; 
    iterate_over(a.cbegin(), a.cend()); 

    int b = 5; 
    iterate_over(&b, std::next(&b)); 
} 

Điều này dường như làm việc một cách chính xác bằng g ++ 5.2, nhưng tôi đang tự hỏi nếu điều này là thực sự được xác định hành vi và nếu có bất kỳ vấn đề tiềm năng?

+0

Cặp lặp lại mô tả ** phạm vi **. Thùng chứa là một cách tạo phạm vi, nhưng chúng không phải là cách duy nhất. Không có yêu cầu mà các trình vòng lặp trỏ đến các phần tử của một thùng chứa. –

+0

Cảm ơn, đã chỉnh sửa câu hỏi để rõ ràng. – cloakedlearning

+0

Có vô số câu hỏi/câu hỏi liên quan/trùng lặp về vấn đề này, bao gồm: https://stackoverflow.com/questions/14505851/is-the-one-past-the-end-pointer-of-a-non-array -type-a-valid-concept-in-c, https://stackoverflow.com/questions/2405555/string-s-s1-legal-ub, https://stackoverflow.com/questions/21411102/treating-a -single-object-like-an-array-với-một-yếu tố-tham-một-qua-cuối-poi, vv – WhozCraig

Trả lời

11

Có điều này là hành vi được xác định. Đầu tiên chúng tôi có từ [expr.add]/4

Vì mục đích của các toán tử này, con trỏ đến đối tượng nonarray hoạt động giống như con trỏ đến phần tử đầu tiên của mảng có độ dài bằng loại đối tượng làm loại phần tử của nó.

Vì vậy, một đối tượng duy nhất được coi là một mảng có độ dài 1. Sau đó, chúng ta có [expr.add]/5

[...] Hơn nữa, nếu các điểm biểu P đến phần tử cuối cùng của đối tượng mảng, biểu thức (P) +1 trỏ một phần tử cuối cùng của đối tượng mảng, và nếu biểu thức Q trỏ một phần tử cuối cùng của đối tượng mảng, biểu thức (Q) -1 điểm thành phần tử cuối cùng của đối tượng mảng. Nếu cả toán hạng con trỏ và điểm kết quả cho các phần tử của cùng một đối tượng mảng hoặc một phần tử cuối cùng của đối tượng mảng, thì việc đánh giá sẽ không tạo ra tràn; nếu không, hành vi không xác định.

tôi nhấn mạnh

Vì vậy, kể từ khi phần tử mảng đầu tiên cũng là phần tử mảng cuối cùng, và thêm 1 đến phần tử mảng cuối cùng mang đến cho bạn một quá khứ đối tượng, nó là hợp pháp.

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