Чому std :: transform та подібні додають цикл 'for' до (void)?


78

Для чого призначений (void) ++__resultнаведений нижче код?

Реалізація для 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;
}

6
Цікаво, чи справді люди, які пишуть посібники зі стилю, вважають, що цей код був би зрозумілішим, якби автор писав static_cast<void>(++__result)...
Брайан

Відповіді:


105

Можливо перевантаження operator,. Приведення будь-якого операнда до voidзапобігає виклику будь-якого перевантаженого оператора, оскільки перевантажені оператори не можуть приймати voidпараметри.


27
Ого. Це ніколи б не сталося для мене.
Енджу більше не пишається SO

11
@Angew таких багато. Для більшого задоволення прочитайте цю публікацію STL, інженера компілятора Microsoft.
Джордж Хілліард

7
Подібним чином ви побачите рясне використання addressofабо еквівалент у стандартній бібліотеці замість унарного &.
TC

4
@ JDługosz Ha. Так, клас може це забезпечити, але він не використовуватиметься. Перетворення voidзавжди буде просто відкидати значення, не дивлячись, які оператори перетворення доступні. Єдиний спосіб зателефонувати такому оператору - це явний expr.operator void()дзвінок.

18
абоstd::who_made_comma_overloadable
М.М.

7

Це дозволяє уникнути виклику перевантаження, operator,якщо такий є. Оскільки тип voidне може бути аргументом функції (оператора).

Іншим підходом було б вставити void()посередині:

++__first, void(), ++__result
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.