2017-02-04 1 views

Répondre

0

Si j'ai une fonction non membre de constexpr prendre un paramètre de référence at-il être une référence constante?

Non, ce n'est pas le cas, mais c'est mieux.

L'objectif principal d'une fonction constexpr est d'évaluer les expressions lors de la compilation. Cela n'a pas de sens de passer une référence non-const à une telle fonction. Si vous choisissez de modifier l'objet d'entrée dans la fonction, je vais devoir vous demander pourquoi? Si vous ne modifiez pas l'objet d'entrée, il est préférable d'utiliser une référence const, de la même manière que c'est toujours une bonne idée de transformer les fonctions membres qui ne modifient pas un objet en fonctions membres const.

Le code suivant ne fonctionne pas car un objet temporaire ne peut pas être utilisé lorsque la fonction attend un const non référence

struct Foo { int i; }; 

constexpr bar(Foo& f) { return f.i * 2; } 

int main() 
{ 
    int arr[bar({20})]; // Can't use a temp object 
} 

Le code suivant fonctionne. La fonction peut être utilisée avec des objets temporaires ainsi que des objets pouvant être utilisés comme valeurs lues.

struct Foo { int i; }; 

constexpr bar(Foo const& f) { return f.i * 2; } 

int main() 
{ 
    int arr[bar({20})]; 
    Foo f{20}; 
    int v = bar(f); 
} 
+0

Toutes les références ou de liens –

+0

@BlairDavidson, j'ai ajouté un peu plus de description pour expliquer ma qualification « meilleur ». J'espère que cela a du sens. –

0

Réponse courte: Non

Réponse longue: Non, parce que l'opérateur const assure seulement que les données de la fonction non-membre ne sera pas changé - mais si vous passez un paramètre , ce paramètre étranger peut être modifié