2012-05-01 17 views
10

Tôi dường như không thể tìm thấy bất kỳ thuật toán chuẩn nào có thể chứng minh yêu cầu về mặc định xây dựng một ForwardIterator.Tại sao các ForwardIterator được yêu cầu để mô hình DefaultConstructible?

Có lý do thực sự nào cho việc đó hay không hoặc tôi có an toàn để bỏ qua nó không?

+4

Nó không quan trọng nếu có một lý do thực tế cho nó; nó là bắt buộc*. Vì vậy, bỏ qua các yêu cầu lúc nguy hiểm của bạn. –

+1

Vâng, nếu trình vòng lặp logic dựa vào một đối số, cách khác là thêm các hàm tạo mặc định để lại đối tượng ở trạng thái không hợp lệ, điều này cũng có vẻ như đang bị tán tỉnh với nguy hiểm. – Ayjay

+0

A * làm việc * thay thế sẽ là để thay đổi vòng lặp của bạn để họ không dựa vào một đối số. Đặt chúng ở trạng thái rỗng nhưng hợp lệ. –

Trả lời

4

Nó ở đó để giảm bớt việc sử dụng các loại vòng lặp, cho cả các thuật toán tiêu chuẩn và người sử dụng của khách hàng.

Ví dụ (hãy nhớ rằng RandomAccessIterator là một subtype của ForwardIterator):

template <class RandomAccessIterator> 
    void sort (RandomAccessIterator first, RandomAccessIterator last) 
{ 
    RandomAccessIterator pivot, i, j; 
    //do your sorting algorithm   
} 

Nếu họ không mặc constructible bạn sẽ cần phải giao cho first hoặc last chỉ dành riêng cho nó để biên dịch.

Bạn không cần nó được đặt thành giá trị mặc định. Bất kỳ việc sử dụng trình lặp nào chưa được khởi tạo như vậy là không xác định. Không có nghĩa là sẽ không khôn ngoan để thêm một số kiểm tra, đặc biệt là trong các bản dựng gỡ lỗi.

Và không, bạn không nên ném vào hàm tạo mặc định. Nó sẽ phù hợp về mặt kỹ thuật, nhưng nhiều thuật toán sẽ thất bại đột ngột.

+0

Đó là một đối số cho 'RandomAccessIterator' để mô hình' DefaultConstructible', không phải 'ForwardIterator', mặc dù vậy. 'InputIterator' không được yêu cầu để mô hình' DefaultConstructible', tại sao 'ForwardIterator'? – Ayjay

+1

Chưa kể, tôi không biết liệu có cho phép thực hiện dễ dàng các thuật toán chuẩn dễ dàng hơn không đáng yêu không cho phép sử dụng các tham chiếu và các kiểu không cấu hình mặc định khác. Nó có ý nghĩa sâu rộng trong tất cả các kiểu dữ liệu của bạn - đột nhiên, mọi thứ mà trình vòng lặp sử dụng cũng phải cho phép xây dựng mặc định và trạng thái "được xây dựng nhưng không hợp lệ". – Ayjay

+0

Cũng loại mã đó sẽ chống lại các nguyên tắc mã hóa dựa trên RAII nơi khởi tạo được bắt buộc tại điểm định nghĩa. – dirkgently

3

Từ bản sao của tôi về dự thảo:

24.2.5 Chuyển lặp [forward.iterators]

Một lớp học hoặc một built-in loại X thỏa mãn các yêu cầu của một forward iterator nếu

[...]

- X thỏa mãn các yêu cầu DefaultConstructible (20.2.1),

và sau đó:

20.2.1 yêu cầu lập luận Template

Nói chung, một constructor mặc định là không cần thiết. Một số vùng chứa nhất định chữ ký hàm thành viên của lớp chỉ định hàm tạo mặc định là đối số mặc định . T() phải là một biểu thức được xác định rõ (8.5) nếu một số của các chữ ký đó được gọi bằng cách sử dụng đối số mặc định (8.3.6).

Có hai điều cần lưu ý ở đây:

  • Dòng đầu tiên cho chúng ta biết một ctor mặc định là hiếm khi cần thiết (mà hầu hết câu trả lời câu hỏi của bạn)
  • Yêu cầu có lẽ là một gợi ý iterator rằng ngữ nghĩa nên tương thích với con trỏ, sau này được cấu hình mặc định (không đọc để phá vỡ mã hiện có).
+0

Điều đó dường như ngụ ý rằng Trình chuyển tiếp cần là DefaultConstructible iff bạn gọi một trong những "ký hiệu hàm thành viên lớp chứa nhất định" với nó. Liệu tiêu chuẩn có chỉ định bất kỳ thời điểm nào khi điều đó phải xảy ra không? – Ayjay

+0

@Ayjay: Tiêu chuẩn phải cung cấp bất kỳ chức năng thành viên nào như vậy. Tôi không thể đặt tên cho một cái, nhưng tôi sẽ không ngạc nhiên nếu không có. Điều đó sẽ chỉ ra cho tôi rằng điều này đã được tiến hành cắt giảm các nhà văn thư viện tương lai một số slack. – dirkgently

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