Maison > développement back-end > C++ > Pourquoi ne puis-je pas utiliser les paramètres de fonction dans les expressions constantes ?

Pourquoi ne puis-je pas utiliser les paramètres de fonction dans les expressions constantes ?

Patricia Arquette
Libérer: 2024-11-15 08:26:02
original
1078 Les gens l'ont consulté

Why Can't I Use Function Parameters in Constant Expressions?

Pourquoi ne puis-je pas utiliser les paramètres de fonction dans les expressions constantes ?

Les expressions constantes sont des expressions qui peuvent être évaluées au moment de la compilation. Les fonctions Constexpr sont des fonctions qui peuvent être évaluées au moment de la compilation si elles sont appelées avec des paramètres constexpr.

Dans le code, la fonction make_const est une fonction constexpr. Cependant, le paramètre i dans t1 n'est pas un paramètre constexpr, car il n'est pas spécifié comme const.

1

2

3

4

void t1(const int i)

{

    constexpr int ii = make_const(i);  // error: i is not a constant expression

}

Copier après la connexion

Pour résoudre ce problème, on peut soit faire de i un paramètre constant en changeant son type en const int, soit en définissant t1 comme une fonction constexpr elle-même :

1

2

3

4

void t1(const int i)  // const int i to make i a constant parameter

{

    constexpr int ii = make_const(i);

}

Copier après la connexion

1

2

3

4

constexpr int t1(const int i)  // constexpr t1 to make t1 a constexpr function

{

    return make_const(i);

}

Copier après la connexion

Un autre problème survient lors de l'utilisation d'une fonction constexpr dans une fonction modèle destinée à renvoyer une valeur constexpr.

1

2

3

4

5

6

7

8

9

template<int i>

constexpr bool do_something(){

    return i;

}

 

constexpr int t1(const int i)

{

    return do_something<make_const(i)>();   // error: i is not a constant expression

}

Copier après la connexion

Dans ce cas, le compilateur ne peut pas garantir que le paramètre i soit une expression constante, car il dépend de la valeur du paramètre template passé à do_something. Pour garantir que t1 peut être évalué au moment de la compilation, le paramètre de modèle i doit être une expression constante.

Une approche alternative consiste à utiliser std::variant et std::integral_constant pour créer une constante de compilation qui peut être utilisé conjointement avec les valeurs d'exécution.

1

2

3

4

5

6

template<auto I>

using constant_t=std::integral_constant<decltype(I),I>;

template<auto I>

constexpr constant_t<I> constant_v={};

template<auto...Is>

using var_enum_t=std::variant<constant_t<Is>...>;

Copier après la connexion

Cela permet de créer une variante constante de compilation qui peut être sélectionnée au moment de l'exécution à l'aide de std::visit.

1

2

3

4

auto idx=var_index<5>(3/* 3 can be runtime */);

std::visit([](auto three){

  // three is a compile time value here

}, idx);

Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal