ternario operador ejemplo c++ constexpr c++17 if-constexpr

c++ - ejemplo - operador ternario python



Operador ternario equivalente para constexpr si? (2)

Tal vez me perdí algo, pero no puedo encontrar ninguna pista: ¿hay un operador constante en C ++ 17 equivalente a constexpr-if?

template<typename Mode> class BusAddress { public: explicit constexpr BusAddress(Address device) : mAddress(Mode::write ? (device.mDevice << 1) : (device.mDevice << 1) | 0x01) {} private: uint8_t mAddress = 0; };


No, no hay constexepr operador condicional. Pero podría envolver todo en una lambda y evaluarlo inmediatamente (un IIFE ):

template<typename Mode> class BusAddress { public: explicit constexpr BusAddress(Address device) : mAddress([&]{ if constexpr (Mode::write) { return device.mDevice << 1; } else { return (device.mDevice << 1) | 0x01; } }()) { } private: uint8_t mAddress = 0; };

Puede que no sea el código más sexy de todos, pero hace el trabajo. Tenga en cuenta que las lambdas están constexpr de forma predeterminada siempre que sea posible a partir de N4487 y P0170 .


Parece que estás actuando bajo la creencia de que if constexpr es una optimización de rendimiento. No lo es Si coloca una expresión constante en una cláusula ?: Cualquier compilador que valga la pena usar determinará en qué se resuelve y eliminará la condición. Por lo tanto, el código tal como lo ha escrito casi seguramente se compilará en una sola opción, para un Mode particular.

El propósito principal de if constexpr es eliminar la otra rama por completo. Es decir, el compilador ni siquiera comprueba si es sintácticamente válido . Esto sería para algo en el que if constexpr(is_default_constructible_v<T>) , y si es verdadero, haces T() . Con una instrucción if regular, si T no es constructible por defecto, T() aún tendrá que ser un código sintácticamente válido incluso si la cláusula if rodea es una expresión constante. if constexpr elimina ese requisito; el compilador descartará las declaraciones que no estén en la otra condición.

Esto se vuelve aún más complicado para ?: , Porque el tipo de expresión se basa en los tipos de los dos valores. Como tal, ambas expresiones deben ser expresiones legales, incluso si una de ellas nunca se evalúa. Una forma constexpr de ?: Presumiblemente descartaría la alternativa que no se toma en el momento de la compilación. Y, por lo tanto, el tipo de expresión solo debería basarse en uno de ellos.

Eso es algo muy diferente.