2017-05-15 48 views
16

Poniższy kod pochodzi z przykładu realizacji std::lexicographical_compare na cppreference.com:Dlaczego (void) między dwóch oddzielonych przecinkami oświadczenia w pętli 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); 
} 

Dlaczego istnieje (void) w pętli, a co byłoby konsekwencja nie umieszczenia go tam?

+0

Ktoś planuje dodać '(void)' przed '++ first1', ponieważ' ++ first1, (void) ++ first2' może nadal tworzyć jakiś 'operator,' zadeklarowany gdzieś, co może nadal powodować problemy. – cpplearner

+0

@cpplearner Ktoś, hę? –

Odpowiedz

25

Jeżeli rodzaj wartości zwrócony przez operatora prefiks kroku wynoszącą InputIt1 typu ma przeciążenia operatora przecinek następnie ekspresji ++first1, ++first2 może inicjować, więc odlewanie wynik ++first2 do void eliminującą przeciążenia operatora przecinek wywołany od przeciążony operatora przecinek nie może zaakceptuj void jako parametr.

+1

Potwierdzono obłąkane specyfikacje językowe. Czy ktokolwiek faktycznie widział * uzasadnione * użycie przeładowania tego? –

+2

@Passer By :: boost :: assign – VTT

+0

Huh? Jak to jest używane? Po prostu sprawdź boost :: assign –

6

Wydaje się to być paranoicznym implementatorem, który obejmuje ich bazy, ponieważ nie zna dokładnych szczegółów typów, z którymi ma do czynienia.

Możesz lub nie wiesz, że operator , może być przeciążony dla typów. Z tego powodu mogą wystąpić niezamierzone konsekwencje podczas używania instrukcji, takiej jak ++first1, ++first2 lub nawet first1, first2.

Umieszczono w nim obsadę (void), tak aby żaden przeciążony operator , nie mógł wejść w życie, ponieważ operatorzy nie mogą działać na niekompletnym typie void.