GCC 4.9.0 est disponible et dispose d'un meilleur support de C++11 et C++14
Ajout du support de std::regex et plein d'autres nouveautés
Le 2014-04-22 20:42:25, par LittleWhite, Responsable 2D/3D/Jeux
La nouvelle version de GCC arrive et nous propose de nombreuses améliorations liées au support du C++11 et du C++14. Un des ajouts les plus importants est le support des expressions régulières à travers std::regex.
De plus, l'implémentation de la déduction du type de retour a été mise à jour pour correspondre à la norme N3638. Plus précisément, cela permet d'utiliser decltype(auto) à la place du auto seul :
G++ supporte maintenant la capture des listes d'initialisations dans les lambda :
Le support des tableaux à taille variable définis dans le C++1y. Ce support existait depuis de nombreuses années à travers la norme GNU/C99, mais maintenant, ces tableaux supportent aussi les listes d'initialisations et la capture par référence par une expression lambda. Avec le mode C++1y, G++ indiquera une erreur pour les usages interdits par le standard, notamment la création d'un pointeur ou l'application de sizeof() sur de tels tableaux.
Toutefois, il faut savoir que les tableaux à taille variable n'apparaîtront peut être pas dans C++14, mais seront intégrés dans un document à part et peut être dans C++17.
G++ supporte l'attribut [[deprecated]] (module les bogues de [[gnu::deprecated]]. Les classes et les fonctions peuvent ainsi être marquées dépréciées et faire apparaître un message additionnel :
Le support d'un séparateur entre les chiffres a été ajouté. Les nombres peuvent ainsi être plus lisibles :
G++ supporte les lambdas polymorphiques :
Finalement, de nombreuses améliorations ont été effectuées pour supporter le nouveau standard C++14 :
G++ embarque maintenant une implémentation de std::experimental::optional et std::experimental::string_view.
La fonction std::copy_exception est maintenant dépréciée et sera supprimée dans la prochaine version. Vous devez utiliser std::make_exception_ptr à la place.
Votre opinion
Utilisez-vous GCC ? Pourquoi le préférez-vous aux autres compilateurs ?
Source
Modifications de la version 4.9
De plus, l'implémentation de la déduction du type de retour a été mise à jour pour correspondre à la norme N3638. Plus précisément, cela permet d'utiliser decltype(auto) à la place du auto seul :
Code : |
1 2 3 | int& f(); auto i1 = f(); // int decltype(auto) i2 = f(); // int& |
Code : |
[x = 42]{ ... };
Toutefois, il faut savoir que les tableaux à taille variable n'apparaîtront peut être pas dans C++14, mais seront intégrés dans un document à part et peut être dans C++17.
Code : |
1 2 3 4 5 | void f(int n) { int a[n] = { 1, 2, 3 }; // envoie std::bad_array_length si n < 3 [&a]{ for (int i : a) { cout << i << endl; } }(); &a; // erreur, accès à l'adresse d'un tableau à taille variable } |
Code : |
1 2 3 4 5 6 7 8 9 10 11 12 | class A; int bar(int n); #if __cplusplus > 201103 class [[deprecated("A is deprecated in C++14; Use B instead")]] A; [[deprecated("bar is unsafe; use foo() instead")]] int bar(int n); int foo(int n); class B; #endif A aa; // warning: 'A' is deprecated : A is deprecated in C++14; Use B instead int j = bar(2); // warning: 'int bar(int)' is deprecated : bar is unsafe; use foo() instead |
Code : |
1 2 3 4 5 | int i = 1048576; int j = 1'048'576; int k =0x10'0000; int m = 0'004'000'000; int n = 0b0001'0000'0000'0000'0000'0000; |
Code : |
1 2 | double x = 1.602'176'565e-19; double y = 1.602'176'565e-1'9; |
Code : |
1 2 | // un objet fonctionnel qui incrémente n'importe quel type auto incr = [](auto x) { return x++; }; |
- correction des fonctions membres constexpr sans const ;
- implémentation de la fonction std::exchange() ;
- adressage des tuples par le type ;
- implémentation de std::make_unique ;
- implémentation de std::shared_lock ;
- std::result_of respecte SFINAE ;
- ajout de l'opérateur () à integral_constant ;
- ajout d'expressions définies par l'utilisateur pour les types de la bibliothèque standard std::basic_string, std::chrono::duration et std::complex ;
- ajout de manipulateurs E/S pour les chaînes de caractères entre guillemets ;
- ajout de membres constexpr à <utility>, <complex>, <chrono> et quelques conteneurs ;
- ajout de std::integer_sequence traité au moment de la compilation ;
- ajout de traits de transformation plus propres ;
- modification des foncteurs de <functional> plus faciles à utiliser et plus génériques.
G++ embarque maintenant une implémentation de std::experimental::optional et std::experimental::string_view.
La fonction std::copy_exception est maintenant dépréciée et sera supprimée dans la prochaine version. Vous devez utiliser std::make_exception_ptr à la place.
Votre opinion
Source
Modifications de la version 4.9
-
mintho carmoMembre éclairé
C'est std::experimental::optionalc'est corrigé, merci.
Précision, pour activer le support de C++1y : -std=c++1yle 22/04/2014 à 23:30 -
SpleeenMembre régulierEt l'implémentation d'OpenMP dans gcc4.9 ?le 23/04/2014 à 10:47
-
CP / MMembre actifgcc 4.9 implémente désormais la quasi intégralité de la norme OpenMP 4.0. Plus de détails ici.le 23/04/2014 à 11:52
-
SpleeenMembre régulierOui je trouvais ça dommage de pas en parler...le 23/04/2014 à 11:56
-
oodiniMembre émérite[[deprecated]] et les séparateurs de chiffres, c'est du C++1y ?
Si non, il serait bien de clairement séparer ce qui relève de la norme du reste.le 23/04/2014 à 12:14 -
mintho carmoMembre éclairéA part std::regex, tout le reste est C++1yle 23/04/2014 à 13:34
-
oodiniMembre émériteOK, merci !le 23/04/2014 à 13:48
-
iNaKollMembre régulierUtilisez-vous GCC ?
Oui*
Pourquoi le préférez-vous aux autres compilateurs ?
1) Respect des derniers standards (seul clang semble faire mieux sur ce point)
2) Ne force pas la lourde mise à jour d'un environnement de développement intégré (Visual Studio?)
3) Nombreuses plateformes supportées (clang?)
*HS:
Je devrais passer de GCC 4.8 à GCC 4.9 cette semaine. J'attendais avec impatience la 4.9
Malheureusement en entreprise, il est souvent difficile de faire évoluer les choses rapidement. Exemple: dans ma boite, on est parti pour livrer des systèmes sous windows xp pour encore quelques années sans que ca ne choque personne. Bref, tant que j'entendrais parler de "C/C++" au boulot j'aurais du mal à vendre du "C++11" et au delà...
J'ai une petite question : qui utilise du code compilé en C++11 en entreprise??le 27/04/2014 à 14:33 -
jblecanardMembre expertUtilisez-vous GCC ?
Oui
Pourquoi le préférez-vous aux autres compilateurs ?
Je lui préfère Clang, que j'utilise également. J'utilise aussi GCC car:
- Pas de raison de prendre le risque de basculer la prod en version compilée avec Clang sans apporter la preuve qu'il y a un gain conséquent (les benchmarks sont peu parlants : aucun des deux compilo ne bat l'autre de manière systématique, cela dépend des applications).
- C'est bien de faire passer son code dans deux compilateurs pour valider un minimum la portabilité du code.
Moi. Mais je sais comme ça peut être compliqué dans certaines boîtes, j'ai la chance de bosser sur un projet qui nous permet ce type d'évolutions.le 28/04/2014 à 10:31 -
white_tentacleMembre émériteMoi. Et je pense ne pas être le seul
.
La cible étant linux, le compilo utilisé gcc 4.7, aucune raison de se priver, surtout quand on a la chance de partir sans un historique monstrueux. Je me suis juste pris dans les dents le non-support désastreux des regex (qui n’auraient jamais dû être publié en l’état).
Sinon, je retiens surtout de ces changements :
- make_unique (enfin !)
- es regex, histoire d’éviter des dépendances à boost ou qt
- l’attribut deprecated
Le reste me laisse plus circonspect (notamment les tableaux de taille variable qui ont l’air cool mais ne servent jamais).le 28/04/2014 à 17:52