Est-ce que la littérature composée est Standard C++?

Composé de Littéraux sont un C99 construire. Même si je peux le faire en C++:

#include <iostream>
using namespace std;

int main() {
    for (auto i : (float[2]) {2.7, 3.1}) cout << i << endl;
}

il semble que par exemple MSVC supporte comme extension . Pourtant, tous les compilateurs que je peux mettre la main sur, compiler le code mentionné ci-dessus.

Donc est-ce une fonctionnalité disponible en C++14 ? Y a - t-il un terme standard différent (il me semble que créer juste un temporaire en utilisant l'initialisation bracée)?


Side Note : "Compound Literals" (ou ce que je devrais appeler le ci-dessus) sont un pack expansion context (juste pour mentionner une fonctionnalité)

15
demandé sur Community 2015-01-23 21:33:47

2 réponses

il s'agit d'une extension que les deux gcc et clang prise en charge. Le document du CCG dit:

comme extension, GCC supporte les littérales composées en mode C90 et en C++, bien que la sémantique soit quelque peu différente en C++.

si vous construisez avec - pédant vous devriez recevoir un avertissement, par exemple clang dit ( voir en direct ):

avertissement: composé littéraux sont un C99 fonctionnalité spécifique à l' [-Wc99-extensions]

Note, les différences sémantiques en C++ ne sont pas mineures et le code qui serait bien défini en C99 peut avoir un comportement non défini en C++ avec cette extension:

en C++, Un composé littéral désigne un objet temporaire, qui vie jusqu'à la fin de sa pleine expression. Comme un résultat bien défini Le code C qui prend l'adresse d'un sous-objet d'un composé littéral peut être indéfini en C++.

22
répondu Shafik Yaghmour 2015-01-23 18:51:23
(float[2]) {2.7, 3.1}

est un composé C99 littéral. Certains compilateurs le prennent en charge en C++ comme extension.

float[2] {2.7, 3.1}

est une erreur de syntaxe.

Donné using arr = float[2]; ,

arr {2.7, 3.1}

est valide C++ cette liste-initialise un tableau temporaire de deux float s.

{2.7, 3.1}

est appelé un attaché-INIT-list .

enfin, pour votre code,

for (auto i : {2.7, 3.1}) cout << i << endl;

fonctionne aussi bien et est parfaitement valide C++ - ce qui construit un std::initializer_list<double> sous le capot. Si vous voulez vraiment float s, ajoutez le suffixe f aux nombres.

22
répondu T.C. 2015-01-23 18:58:20