GCC 4.9.0 est disponible et dispose d'un meilleur support de C++11 et C++14
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 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 int& f(); auto i1 = f(); // int decltype(auto) i2 = f(); // int&
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.
Code : Sélectionner tout - Visualiser dans une fenêtre à part [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.
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 - Visualiser dans une fenêtre à part
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 }
Le support d'un séparateur entre les chiffres a été ajouté. Les nombres peuvent ainsi être plus lisibles :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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;G++ supporte les lambdas polymorphiques :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 double x = 1.602'176'565e-19; double y = 1.602'176'565e-1'9;
Finalement, de nombreuses améliorations ont été effectuées pour supporter le nouveau standard C++14 :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Utilisez-vous GCC ? Pourquoi le préférez-vous aux autres compilateurs ?
Source
Modifications de la version 4.9
Partager