You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: _articles/c++_auto.md
+11-11Lines changed: 11 additions & 11 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -281,7 +281,7 @@ Mais ne vous arrêtez pas au "**Almost** Always Auto", nous allons revenir sur c
281
281
282
282
A partir de C++14, on peut **laisser le compilateur déduire le type de retour** d'une fonction à partir des ``return`` qui la composent:
283
283
284
-
{% highlight cpp %}
284
+
{% highlight cpp highlight_lines="2" %}
285
285
template<class Lhs, class Rhs>
286
286
auto sum(Lhs lhs, Rhs rhs)
287
287
{
@@ -298,7 +298,7 @@ Dans l'exemple suivant, un **``auto`` as a return type** est utilisé dans ``Su
298
298
Dans ``Sum.h`` on utilise un [**Trailing return type**](#trailing-return-type-depuis-c11) pour **renseigner explicitement le type de retour**.
299
299
300
300
Sum.h
301
-
{% highlight cpp %}
301
+
{% highlight cpp highlight_lines="2" %}
302
302
template<class Lhs, class Rhs>
303
303
auto sum(Lhs lhs, Rhs rhs) -> decltype(lhs + rhs);
304
304
{% endhighlight %}
@@ -370,7 +370,7 @@ Contrairement à ``auto``, ``decltype(auto)`` permet de **préserver les propri
370
370
371
371
``decltype(auto)`` est particulièrement utile lorsqu'il est nécessaire de préserver la nature exacte de l'expression retournée, que ce soit une référence ou un type constant:
372
372
373
-
{% highlight cpp linenos %}
373
+
{% highlight cpp linenos highlight_lines="5" %}
374
374
int foo();
375
375
int& bar();
376
376
@@ -385,7 +385,7 @@ auto call(Function function) -> decltype(auto)
385
385
{% endhighlight %}
386
386
387
387
``decltype(auto)`` est aussi utilisable pour initialiser une variable en conservant les propriétés cvref de la valeur assignée:
388
-
{% highlight cpp %}
388
+
{% highlight cpp linenos highlight_lines="3" %}
389
389
auto main() -> int
390
390
{
391
391
decltype(auto) result = call(bar);
@@ -438,7 +438,7 @@ auto main() -> int
438
438
439
439
### ``std::array``
440
440
441
-
{% highlight cpp linenos highlight_lines="6" %}
441
+
{% highlight cpp linenos highlight_lines="4" %}
442
442
auto main() -> int
443
443
{
444
444
auto position = std::array<int>{10, 15};
@@ -502,7 +502,7 @@ auto main() -> int
502
502
La déstructuration doit **respecter l'ordre des paramètres**.<br>
503
503
**Leur nom n'a pas d'importance**, il peut être changé. Par exemple: ``auto [foo, bar] = position;``
504
504
505
-
{% highlight cpp linenos %}
505
+
{% highlight cpp linenos highlight_lines="10" %}
506
506
struct Position2d
507
507
{
508
508
int x;
@@ -646,7 +646,7 @@ Pour les classes/structures n'ayant que des variables membres publiques, la dés
646
646
647
647
Si une classe/structure contient des variables membre privées, il n'est pas possible de les ignorer dans une *structured binding declaration*.
648
648
649
-
{% highlight cpp linenos highlight_lines="6" %}
649
+
{% highlight cpp linenos %}
650
650
struct Person
651
651
{
652
652
Person(std::string firstName, std::string lastName, int birthYear):
@@ -678,7 +678,7 @@ Ce qui implique d'ajouter:
678
678
- Une spécialisation de ``std::tuple_size``
679
679
- Une spécialisation de ``std::tuple_element``
680
680
681
-
{% highlight cpp linenos %}
681
+
{% highlight cpp linenos highlight_lines="42" %}
682
682
struct Person
683
683
{
684
684
Person(std::string firstName, std::string lastName, int birthYear):
@@ -787,7 +787,7 @@ Dans une *range-based for loop*, **la condition n'évalue pas les variables issu
787
787
La *structured binding declaration* dans une condition fait une vérification un peu similaire sur l'objet.
788
788
La condition **caste l'objet en bool** pour vérifier la validité de la condition, **puis décompose ses éléments**.
@@ -836,7 +836,7 @@ Cette structure a la particularité d'avoir un [``operator bool()``](https://en.
836
836
Cet opérateur vérifie que sa variable membre publique ``ec`` (error code) ne contient aucun code d'erreur (``std::errc{}``).
837
837
838
838
Avant C++26, on utilise l'écriture:
839
-
{% highlight cpp linenos %}
839
+
{% highlight cpp linenos highlight_lines="3 4" %}
840
840
auto string = std::string{};
841
841
string.resize(20);
842
842
if (auto [pointer, errorCode] = std::to_chars(std::data(string), std::data(string) + std::size(string), 3.14);
@@ -852,7 +852,7 @@ else
852
852
> Dans le code précédent, remarquez l'utilisation de l'[*init-statement*](/articles/c++/control_flow#init-statement-depuis-c17) dans la condition pour restreindre la portée des variables ``pointer`` et ``errorCode`` au scope de cette condition.
853
853
854
854
Depuis C++26, on peut écrire:
855
-
{% highlight cpp linenos %}
855
+
{% highlight cpp linenos highlight_lines="3" %}
856
856
auto string = std::string{};
857
857
string.resize(20);
858
858
if (auto [pointer, errorCode] = std::to_chars(std::data(string), std::data(string) + std::size(string), 3.14))
0 commit comments