IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

Vous êtes nouveau sur Developpez.com ? Créez votre compte ou connectez-vous afin de pouvoir participer !

Vous devez avoir un compte Developpez.com et être connecté pour pouvoir participer aux discussions.

Vous n'avez pas encore de compte Developpez.com ? Créez-en un en quelques instants, c'est entièrement gratuit !

Si vous disposez déjà d'un compte et qu'il est bien activé, connectez-vous à l'aide du formulaire ci-dessous.

Identifiez-vous
Identifiant
Mot de passe
Mot de passe oublié ?
Créer un compte

L'inscription est gratuite et ne vous prendra que quelques instants !

Je m'inscris !

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

0PARTAGES

11  0 
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

Une erreur dans cette actualité ? Signalez-nous-la !

Avatar de mintho carmo
Membre éclairé 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
0  0 
Avatar de Spleeen
Membre régulier https://www.developpez.com
Le 23/04/2014 à 10:47
Et l'implémentation d'OpenMP dans gcc4.9 ?
0  0 
Avatar de 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.
0  0 
Avatar de Spleeen
Membre régulier https://www.developpez.com
Le 23/04/2014 à 11:56
Oui je trouvais ça dommage de pas en parler...
0  0 
Avatar de 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.
0  0 
Avatar de mintho carmo
Membre éclairé https://www.developpez.com
Le 23/04/2014 à 13:34
A part std::regex, tout le reste est C++1y
0  0 
Avatar de oodini
Membre émérite https://www.developpez.com
Le 23/04/2014 à 13:48
OK, merci !
0  0 
Avatar de 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??
0  0 
Avatar de 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.
0  0 
Avatar de 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).
0  0