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 , 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 :
Code : Sélectionner tout
1
2
3
int& f(); 
auto  i1 = f(); // int 
decltype(auto) i2 = f(); // int&
G++ supporte maintenant la capture des listes d'initialisations dans les lambda :
Code : Sélectionner tout
[x = 42]{ ... };
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.
Code : Sélectionner tout
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 
}
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 :
Code : Sélectionner tout
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
Le support d'un séparateur entre les chiffres a été ajouté. Les nombres peuvent ainsi être plus lisibles :
Code : Sélectionner tout
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 : Sélectionner tout
1
2
double x = 1.602'176'565e-19; 
double y = 1.602'176'565e-1'9;
G++ supporte les lambdas polymorphiques :
Code : Sélectionner tout
1
2
// un objet fonctionnel qui incrémente n'importe quel type 
auto incr = [](auto x) { return x++; };
Finalement, de nombreuses améliorations ont été effectuées pour supporter le nouveau standard C++14 :
  • 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

Utilisez-vous GCC ? Pourquoi le préférez-vous aux autres compilateurs ?

Source

Modifications de la version 4.9


Vous avez aimé cette actualité ? Alors partagez-la avec vos amis en cliquant sur les boutons ci-dessous :


 Poster une réponse

Avatar de mintho carmo mintho carmo - Membre actif https://www.developpez.com
le 22/04/2014 à 23:30
C'est std::experimental::optional c'est corrigé, merci.

Précision, pour activer le support de C++1y : -std=c++1y
Avatar de Spleeen Spleeen - Nouveau membre du Club https://www.developpez.com
le 23/04/2014 à 10:47
Et l'implémentation d'OpenMP dans gcc4.9 ?
Avatar de CP / M CP / M - Membre actif https://www.developpez.com
le 23/04/2014 à 11:52
gcc 4.9 implémente désormais la quasi intégralité de la norme OpenMP 4.0. Plus de détails ici.
Avatar de Spleeen Spleeen - Nouveau membre du Club https://www.developpez.com
le 23/04/2014 à 11:56
Oui je trouvais ça dommage de pas en parler...
Avatar de oodini oodini - Membre émérite https://www.developpez.com
le 23/04/2014 à 12:14
[[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.
Avatar de mintho carmo mintho carmo - Membre actif https://www.developpez.com
le 23/04/2014 à 13:34
A part std::regex, tout le reste est C++1y
Avatar de oodini oodini - Membre émérite https://www.developpez.com
le 23/04/2014 à 13:48
OK, merci !
Avatar de iNaKoll iNaKoll - Membre régulier https://www.developpez.com
le 27/04/2014 à 14:33
Utilisez-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??
Avatar de jblecanard jblecanard - Membre expert https://www.developpez.com
le 28/04/2014 à 10:31
Utilisez-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.

Citation Envoyé par iNaKoll  Voir le message
J'ai une petite question : qui utilise du code compilé en C++11 en entreprise??

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.
Avatar de white_tentacle white_tentacle - Membre émérite https://www.developpez.com
le 28/04/2014 à 17:52
Citation Envoyé par iNaKoll  Voir le message
Utilisez-vous GCC ?
J'ai une petite question : qui utilise du code compilé en C++11 en entreprise??

Moi. 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).
Offres d'emploi IT
Ingénieur analyste programmeur (H/F)
Safran - Auvergne - Montluçon (03100)
Chef projet big data - pse flotte H/F
Safran - Ile de France - Évry (91090)
Architecte et intégrateur scade/simulink H/F
Safran - Ile de France - Vélizy-Villacoublay (78140)

Voir plus d'offres Voir la carte des offres IT
Contacter le responsable de la rubrique C++