2017-05-15 47 views
16

下面的代碼來自於std::lexicographical_compare實現例如在cppreference.com爲什麼(無效),兩者之間用逗號分隔的語句在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); 
} 

爲什麼會出現在迴路中的(void),以及會產生什麼沒有把它放在那裏的後果?

+0

有人計劃在++ ++ first1之前加上'(void)',因爲++ ++ first1,(void)++ first2'仍然可以實例化一些'operator,'在某處聲明,這可能仍然會造成麻煩。 – cpplearner

+0

@cpplearner有人,是吧? –

回答

25

如果該值由InputIt1類型的前綴增量操作者返回的類型已經重載逗號然後操作者表達++first1, ++first2可以調用它,所以鑄件的++first2void結果確保沒有過載的逗號運算符,因爲重載逗號操作調用不能接受void作爲參數。

+1

瘋狂的語言規格證實。有沒有人真的看到*合法*使用重載? –

+2

@Passer By :: boost :: assign – VTT

+0

咦?它是如何使用的?剛剛檢出boost :: assign –

6

這似乎是一個覆蓋他們基地的偏執執行者,因爲他們不知道他們正在處理的類型的確切細節。

你可能會也可能不知道operator ,可以重載的類型。因此,使用諸如++first1, ++first2或甚至first1, first2之類的語句時可能會產生無意的後果。

(void)放在那裏,以便任何超載的operator ,不能生效,因爲操作員無法對不完整的void類型進行操作。

相關問題