2017-05-15 27 views
16

Các mã sau đây xuất phát từ một ví dụ thực hiện std::lexicographical_compare trên cppreference.com:Tại sao (void) giữa hai dấu phẩy tách ra tuyên bố trong một vòng lặp for

template<class InputIt1, class InputIt2> 
bool lexicographical_compare(InputIt1 first1, InputIt1 last1, 
          InputIt2 first2, InputIt2 last2) 
{ 
    for (; (first1 != last1) && (first2 != last2); ++first1, (void) ++first2) { 
     if (*first1 < *first2) return true; 
     if (*first2 < *first1) return false; 
    } 
    return (first1 == last1) && (first2 != last2); 
} 

Tại sao lại có một (void) trong vòng lặp, và những gì sẽ là hậu quả của việc không đặt nó ở đó?

+0

Ai đó đang lập kế hoạch để thêm '(void)' trước '++ first1' vì' ++ first1, (void) ++ first2' vẫn có thể khởi tạo một toán tử ', được khai báo ở đâu đó, điều này vẫn có thể gây ra sự cố. – cpplearner

+0

@cpplearner Ai đó, huh? –

Trả lời

25

Nếu kiểu của giá trị trả về bởi toán tử tăng tiền tố của InputIt1 loại đã quá tải toán tử dấu phẩy sau đó biểu hiện ++first1, ++first2 có thể gọi nó, vì vậy đúc kết quả của ++first2-void đảm bảo rằng không điều hành dấu phẩy quá tải được gọi từ nhà điều hành dấu phẩy quá tải không thể chấp nhận void làm thông số.

+1

Thông số ngôn ngữ điên đã được xác nhận. Có ai thực sự thấy * sử dụng hợp pháp * quá tải không? –

+2

@Passer Bởi :: boost :: assign – VTT

+0

Huh? Nó được sử dụng như thế nào? Chỉ cần kiểm tra tăng :: gán –

6

Điều này có vẻ là một người thực hiện hoang tưởng bao gồm các căn cứ của họ bởi vì họ không biết chi tiết chính xác của các loại mà họ đang xử lý.

Bạn có thể hoặc không thể biết rằng operator , có thể bị quá tải cho các loại. Do đó, có thể có những hậu quả không chủ ý khi sử dụng câu lệnh như ++first1, ++first2 hoặc thậm chí chỉ first1, first2.

Đoạn (void) được đặt ở đó sao cho bất kỳ quá tải operator , không thể có hiệu lực, vì người vận hành không thể hoạt động trên loại void không hoàn chỉnh.

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