Warum wandelt std :: transform und ähnliches das 'for'-Schleifeninkrement in (void) um?

78

Was ist der Zweck (void) ++__resultim folgenden Code?

Implementierung für std :: transform:

// std::transform
template <class _InputIterator, class _OutputIterator, class _UnaryOperation>
inline _LIBCPP_INLINE_VISIBILITY
_OutputIterator
transform(_InputIterator __first, _InputIterator __last, _OutputIterator __result, _UnaryOperation __op)
{
    for (; __first != __last; ++__first, (void) ++__result)
        *__result = __op(*__first);
    return __result;
}
wir s
quelle
6
Ich frage mich, ob die Leute, die static_cast<void>(++__result)
Brian

Antworten:

105

Es ist möglich zu überladen operator,. Das Umwandeln eines Operanden in voidverhindert , dass ein überladener Operator aufgerufen wird, da überladene Operatoren keine voidParameter annehmen können .


quelle
27
Beeindruckend. Das wäre mir nie passiert.
Angew ist nicht mehr stolz auf SO
11
@Angew gibt es viele davon. Lesen Sie diesen Beitrag von STL, einem Microsoft-Compiler-Ingenieur, für mehr Spaß .
George Hilliard
7
In ähnlicher Weise werden Sie addressofin der Standardbibliothek eine reichliche Verwendung oder eine gleichwertige Verwendung anstelle von unär sehen &.
TC
4
@ JDługosz Ha. Ja, eine Klasse kann das bereitstellen, aber es wird nicht verwendet. Bei einer Konvertierung in voidwird immer nur der Wert verworfen, ohne zu prüfen, welche Konvertierungsoperatoren verfügbar sind. Der einzige Weg, einen solchen Operator aufzurufen, ist ein expliziter expr.operator void()Aufruf.
18
oderstd::who_made_comma_overloadable
MM
7

Es vermeidet einen überlasteten Anruf, operator,falls vorhanden. Weil der Typ voidkein Argument einer Funktion (Operator) sein kann.

Ein anderer Ansatz wäre das Einfügen void()in die Mitte:

++__first, void(), ++__result
Abyx
quelle