web-dev-qa-db-fra.com

C ++ 11: initialisation correcte de std :: array?

Si j'initialise std :: array comme suit, le compilateur me prévient des accolades manquantes

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

Cela corrige le problème:

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

C'est le message d'avertissement:

missing braces around initializer for 'std::array<int, 4u>::value_type [4] {aka int [4]}' [-Wmissing-braces]

Est-ce juste un bogue dans ma version de gcc, ou est-ce intentionnel? Si oui, pourquoi?

58
Byzantian

Ceci est la simple implémentation de std::array:

template<typename T, std::size_t N>
struct array {
    T __array_impl[N];
};

C'est une structure d'agrégat dont le seul membre de données est un tableau traditionnel, tel que le inner {} est utilisé pour initialiser le tableau interne.

L'élision de l'accolade est autorisée dans certains cas avec l'initialisation de l'agrégat (mais n'est généralement pas recommandée), de sorte qu'une seule accolade peut être utilisée dans ce cas. Voir ici: vecteur C++ de tableaux

44
Pubby

Selon cppreference . Les doubles accolades ne sont requises que si = est omis.

// construction uses aggregate initialization
std::array<int, 3> a1{ {1,2,3} };    // double-braces required
std::array<int, 3> a2 = {1, 2, 3}; // except after =
std::array<std::string, 2> a3 = { {std::string("a"), "b"} };
30
Draco Ater

Les doubles accolades sont nécessaires dans C++ 11 avant le CWG 1270 (non requis dans C++ 11 après la révision et dans C++ 14 et au-delà):

// construction uses aggregate initialization
std::array<int, 3> a1{ {1, 2, 3} }; // double-braces required in C++11 prior to the CWG 1270 revision
                                    // (not needed in C++11 after the revision and in C++14 and beyond)
std::array<int, 3> a2 = {1, 2, 3};  // never required after =

référence std :: array

4
Amit G.