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é)
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++.
(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.