¿Por qué std::transform y similares lanzan el incremento de bucle ‘for’ a (vacío)?

1 minuto de lectura

avatar de usuario
nosotros

Cual es el proposito de (void) ++__result en el código de abajo?

Implementación para 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;
}

  • Me pregunto si las personas que escriben guías de estilo realmente creen que este código sería más claro si el autor hubiera escrito static_cast<void>(++__result)

    – Brian Bi

    13/07/2016 a las 20:49

Es posible sobrecargar operator,. Convirtiendo cualquiera de los operandos en void evita que se llame a cualquier operador sobrecargado, ya que los operadores sobrecargados no pueden tomar void parámetros

  • Guau. Esto nunca se me hubiera ocurrido.

    – Angew ya no está orgulloso de SO

    13 de julio de 2016 a las 16:32

  • @Angew hay muchos de estos. Para más diversión, lea esta publicación por STL, un ingeniero compilador de Microsoft.

    – George Hillard

    13 de julio de 2016 a las 17:18

  • De manera similar, verá un uso copioso de addressof o equivalente en la biblioteca estándar en lugar de unario &.

    – CT

    13 de julio de 2016 a las 18:49

  • @JDługosz Ja. Sí, una clase puede proporcionar eso, pero no se usará. Una conversión a void siempre descartará el valor sin mirar qué operadores de conversión están disponibles. La única forma de llamar a dicho operador es con un explícito expr.operator void() llamar.

    usuario743382

    13 de julio de 2016 a las 21:29

  • o std::who_made_comma_overloadable

    –MM

    13 de julio de 2016 a las 23:06

Evita llamada de sobrecargado operator, si hay alguno. porque el tipo void no puede ser un argumento de una función (operador).

Otro enfoque sería insertar void() en el medio:

++__first, void(), ++__result

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad