47 votes

Différence entre const std::array<T,N> et std::array<const T, N>.

Y a-t-il une différence pratique entre std::array<const T, N> y const std::array<T, N> ?

Il semble que les tableaux non constants contenant des éléments constants ne peuvent toujours pas être échangés ; l'opérateur d'affectation ne fonctionne pas non plus.

Quand dois-je préférer l'un à l'autre ?

#include <array>

std::array<const int, 5> array_of_const = {1,2,3,4,5};
std::array<const int, 5> array_of_const2 = {1,2,3,4,5};

const std::array<int, 5> const_array = {1,2,3,4,5};
const std::array<int, 5> const_array2 = {1,2,3,4,5};

int main()
{
    // Assignment doesn't work for either
    array_of_const = array_of_const2;
    const_array = const_array2;

    // Swapping doesn't work for either
    array_of_const.swap(array_of_const2);
    const_array.swap(const_array2);

    // Indexing...
    array_of_const[0] = 0;
    const_array[0] = 0;

    return 0;
};

3 votes

@DrewDormann Oui, je suis d'accord. Je ne vois aucune bonne raison de les utiliser,

0 votes

Beaucoup de gens semblent détester les questions [de juristes spécialisés dans les langues] sans signification pratique claire.

2 votes

@KarlKnechtel [language-lawyer] n'est pas ajouté par le PO en fait

41voto

Caleth Points 17517

Copies de std::array<const T, N> sont toujours "logiquement const", alors que par défaut une copie de const std::array<T, N> est mutable. Si permettre ou empêcher cela est important pour vous, l'un est préférable à l'autre.

Il y a des différences dans les modèles qu'ils correspondent, par exemple, le cas dans Réponse d'Ilya .

22voto

Lashane Points 8082

Il pourrait y avoir au moins une différence - le cas où vous devez passer une variable à une autre fonction, par exemple :

#include <array>

std::array<const int, 5> cc_arr5 = {1,2,3,4,5};
const std::array<int, 5> cc_arr5_2 = {1,2,3,4,5};

template<class T, std::size_t N>
void func(std::array<T, N>& a) {
    // do not change a, for example just calculate sum
}

int main()
{
    func(cc_arr5);
    func(cc_arr5_2); // this line does not compile

    return 0;
};

2 votes

Eh bien, une différence est une différence, même si elle est artificielle. Bien que nous ayons tous vu des fonctions dans la nature qui prennent des références non-const et ne mutent pas réellement le paramètre, donc je suppose que ce n'est pas si artificiel.

1 votes

C'est exactement l'exemple que j'étais sur le point de poster ... j'ai quelques points de Licorne pour avoir été quelques minutes plus rapide que moi.

1 votes

Envisagez d'élargir l'exemple en montrant que a ne doit pas être mutée dans le corps de la fonction pour que cela fonctionne ? godbolt.org/z/qqPc9qW77

9voto

Serge Ballesta Points 12850

Il s'agit en effet de types différents, de sorte que vous ne pouvez pas utiliser l'un d'eux à un endroit où l'autre serait attendu, par exemple dans un appel de fonction ou une affectation.

Ceci étant dit, comme un tableau est un conteneur de taille fixe sans membre de données auxiliaire, avoir le conteneur const empêche toute modification de ses éléments et avoir les éléments const ne permet aucune modification du conteneur puisqu'il n'a évidemment aucun autre membre de données.

En d'autres termes, les deux types auront les mêmes opérations valides et invalides.

La principale différence à laquelle je peux penser, c'est la const_cast implication : un tableau peut être (implicitement) converti en un tableau const du même type d'élément mais pas en un tableau du type const modifié :

std::array<int, 3> a {1, 2, 3};

std::array<const int, 3> b = a; // Error: no known conversion from 'array<int, [...]>' to 'const array<const int, [...]>
const std::array<int, 3> c = a; // Ok

1 votes

Peut-être deux const_cast implications : L'un des deux types peut également avoir const rejeté.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X