¿Pueden las funciones virtuales ser constexpr?

3 minutos de lectura

¿Pueden funciones virtuales como X::f() en el siguiente código

struct X 
{
    constexpr virtual int f() const 
    {
        return 0;
    }
};

ser constexpr?

  • Piénsalo un minuto. Derrotaría por completo a la constexpr objetivo.

    – πάντα ῥεῖ

    16 de enero de 2016 a las 14:37


  • Tal función hipotética podría usarse como una expresión constante solo si se sabe que el tipo completo de la instancia de llamada es X. Básicamente, esto requeriría que el lenguaje especifique “reglas de desvirtualización”.

    – KerrekSB

    16/01/2016 a las 14:40

  • @πάνταῥεῖ En D puede hacer una evaluación de la función de tiempo de compilación con funciones virtuales. Así que no es impensable.

    – Ralph Tandetzky

    16 de enero de 2016 a las 14:47

  • Bueno, creo que tendría sentido al menos para final funciones para poder ser constexpr.

    – Juan B

    22/10/2016 a las 13:35


  • No solo para los métodos finales. Podría ser útil para una prueba de unidad de tiempo de compilación. Crea una instancia de una clase derivada en la pila y usa un static_assert en el resultado de un método virtual. En ese momento, todo el cuerpo de la función podría ser visible para el compilador.

    – QBziZ

    31 de enero de 2019 a las 9:35

avatar de usuario
Kerrek SB

Esta respuesta ya no es correcta a partir de C++20.

N.º desde [dcl.constexpr]/3 (7.1.5, “El constexpr especificador”):

La definición de un constexpr función deberá satisfacer los siguientes requisitos:

— no será virtual

  • Es raro, por gcc version 4.9.2 20141101 (Red Hat 4.9.2-1) (GCC) funciona

    – neshkeev

    16/01/2016 a las 14:50


  • @zaratustra: Y CCG 6 no 🙁

    – KerrekSB

    16 de enero de 2016 a las 14:57

  • @CiroSantilli华涌低端人口六四事件法轮功: “virtual” significa “en tiempo de ejecución”. “constexpr” significa “en tiempo de compilación”.

    – KerrekSB

    26 de diciembre de 2017 a las 4:01

  • el objeto constexpr polimórfico con su estado podría determinarse en tiempo de compilación

    – Serguéi Krivonos

    29 de octubre de 2018 a las 7:25

  • Tenga en cuenta que virtual constexpr será legal en c++20. ver es.cppreference.com/w/cpp/language/constexpr

    – Yanis.F

    15 de febrero de 2019 a las 16:06

avatar de usuario
Nicolás Bolas

Hasta C++17, virtual no se pudieron declarar las funciones constexpr. La razón general es que, en constexpr código, todo puede suceder en tiempo de compilación. Así que realmente no tiene mucho sentido tener una función que tome una referencia a una clase base y llame virtual funciones en él; también puedes convertirlo en un template función y pasar el tipo real, ya que saber el verdadero tipo.

Por supuesto, este pensamiento no funciona realmente como constexpr el código se vuelve más complejo, o si desea compartir interfaces entre el tiempo de compilación y el código de tiempo de ejecución. En ambos casos, es fácil perder la pista del tipo original. También permitiría std::error_code ser más constexpr-amigable.

Además, el hecho de que C++20 nos permita hacer una asignación dinámica (limitada) de objetos significa que es muy fácil perder la pista del tipo original. Ahora puede crear un vector<Base*> en constexpr código, inserte algunos Derived instancias de clase en él, y pasar eso a un constexpr función a operar.

Entonces C++20 permite virtual funciones a declarar constexpr.

  • Oh, interesante; De hecho, me encontré con un caso en el que el polimorfismo en tiempo de compilación sería De Verdad útil ayer, al intentar configurar una lista de etiquetas en tiempo de compilación de longitud potencialmente variable para ayudar con otras tareas en tiempo de compilación. Usando un const la referencia a una base vacía para permitir que el tamaño de la matriz sea un NTTP en la lista de etiquetas real fue una forma relativamente limpia de resolver uno de los problemas, pero introdujo sus propios problemas debido a la falta de constexpr virtual. ¡Me alegra ver que esto estará disponible pronto!

    – Justin Time – Reincorporar a Monica

    18 sep 2019 a las 16:40

  • @JustinTime¿NTTP?

    – chico curioso

    24 de septiembre de 2019 a las 2:03

  • @curiousguy: parámetro de plantilla sin tipo.

    – Nicolás Bolas

    24 de septiembre de 2019 a las 2:31

avatar de usuario
Nawaz

¿Pueden las funciones virtuales ser constexpr?

Sí. Solo desde C++20las funciones virtuales pueden ser constexpr.

¿Ha sido útil esta solución?