web-dev-qa-db-fra.com

Expliquez constexpr avec const char * const

J'ai le code suivant:

static constexpr const char*const myString = "myString";

Pourriez-vous s'il vous plaît expliquer quelle est la différence entre:

static const char*const myString = "myString";

Quoi de neuf avec constexpr dans ce cas?

15
demonplus

La différence est décrite dans la citation suivante du standard C++ (membres de données statiques 9.4.2)

3 Si un non-volatile le membre de données statique const est de type intégral ou énumération, sa déclaration dans la définition de classe peut spécifier un accolade-ou-égal-initialiseur dans lequel chaque clause d'initialisation qui est une expression d'affectation est une expression constante (5.19). n membre de données statiques de type littéral peut être déclaré dans la définition de classe avec le spécificateur constexpr; si tel est le cas, sa déclaration doit spécifier un accolade ou un initialiseur égal) dans lequel chaque clause d'initialisation qui est un affectation-expression est une expression constante. [Remarque: dans ces deux cas, le membre peut apparaître dans des expressions constantes. —Fin note] Le membre doit toujours être défini dans une étendue d'espace de noms s'il est utilisé par odr (3.2) dans le programme et la définition de la portée d'espace de noms ne doit pas contenir d'initialiseur.

Considérons par exemple deux programmes

struct A
{
    const static double x = 1.0;
};

int main() 
{
    return 0;
}

struct A
{
    constexpr static double x = 1.0;
};

int main() 
{
    return 0;
}

Le premier ne compilera pas tandis que le second compilera.

La même chose est valable pour les pointeurs

Ce programme

struct A
{
    static constexpr const char * myString = "myString";
};

int main() 
{
    return 0;
}

compilera pendant que ce porgramme

struct A
{
    static const char * const myString = "myString";
};

int main() 
{
    return 0;
}

ne compilera pas.

12
Vlad from Moscow