Skip to content

Commit 4957e51

Browse files
committed
Minor fixes
1 parent 5505925 commit 4957e51

File tree

3 files changed

+85
-49
lines changed

3 files changed

+85
-49
lines changed

_articles/c++_adl_niebloids.md

Lines changed: 0 additions & 13 deletions
This file was deleted.

_articles/c++_auto.md

Lines changed: 26 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,9 @@ En C++, écrire ``auto a = 1;`` revient exactement à écrire ``int a = 1;``. Le
7272

7373
{% gif /assets/images/articles/c++/almost_always_auto/person-of-interest-deduction.gif %}
7474

75+
<br>
76+
> Le langage C a effectué le même changement au niveau de [son mot clef ``auto``](https://en.cppreference.com/w/c/language/auto) en [C23](https://en.cppreference.com/w/c/23) en lui donnant la même fonction qu'en C++11 pour faire de l'**inférence de types** ([proposal](https://open-std.org/JTC1/SC22/WG14/www/docs/n3007.htm)).
77+
7578
### Pointeurs et propriétés cvref
7679

7780
Par défaut, ``auto`` ne récupère pas les propriétés **cvref** (``const``/``volatile``/``reference``) de la valeur qui lui est assignée.
@@ -639,7 +642,7 @@ template<class Lhs, class Rhs>
639642
auto sum(Lhs lhs, Rhs rhs) -> decltype(lhs + rhs)
640643
{
641644
return lhs + rhs;
642-
};
645+
}
643646
{% endhighlight %}
644647

645648
> Si vous n'êtes pas familiers avec les templates, passez faire un tour [ici](/articles/c++/templates).
@@ -652,7 +655,7 @@ template<class Lhs, class Rhs>
652655
decltype(lhs + rhs) sum(Lhs lhs, Rhs rhs)
653656
{
654657
return lhs + rhs;
655-
};
658+
}
656659
{% endhighlight %}
657660

658661
> \<source\>:5:10: **error**: 'lhs' was not declared in this scope;<br>
@@ -749,7 +752,7 @@ template<class Lhs, class Rhs>
749752
auto sum(Lhs lhs, Rhs rhs)
750753
{
751754
return lhs + rhs;
752-
};
755+
}
753756
{% endhighlight %}
754757

755758
Cependant, ce n'est pas une écriture que vous verrez souvent car elle **comporte des risques** et qu'elle **ne couvre pas toutes les situations**.
@@ -772,7 +775,7 @@ template<class Lhs, class Rhs>
772775
auto sum(Lhs lhs, Rhs rhs)
773776
{
774777
return lhs + rhs;
775-
};
778+
}
776779
{% endhighlight %}
777780

778781
Il arrive que la fonction contienne plusieurs ``return``.
@@ -786,7 +789,7 @@ auto getText(int value)
786789
return "La valeur est positive"; // const char*
787790
else
788791
return std::string_view{"La valeur est négative"}; // std::string_view
789-
};
792+
}
790793
{% endhighlight %}
791794

792795
Ceci provoque une erreur de compilation, bien qu'un [type commun](/articles/c++/type_traits#type_commun) existe (``std::string_view``)
@@ -802,7 +805,7 @@ auto getText(int value) -> std::string_view
802805
return "La valeur est positive"; // const char*
803806
else
804807
return std::string_view{"La valeur est négative"}; // std::string_view
805-
};
808+
}
806809
{% endhighlight %}
807810

808811
Le compilateur tente maintenant de construire un ``std::string_view`` à partir du ``const char*`` retourné. Ce qui est fait via un appel implicite à un constructeur de ``std::string_view``.
@@ -817,7 +820,7 @@ template<class Lhs, class Rhs>
817820
auto sum(Lhs lhs, Rhs rhs) -> auto
818821
{
819822
return lhs + rhs;
820-
};
823+
}
821824
{% endhighlight %}
822825

823826
Ici, il n'y a pas de redondance du mot clef ``auto``.<br>
@@ -841,7 +844,7 @@ template<class Function>
841844
auto call(Function function) -> decltype(auto)
842845
{
843846
return function();
844-
};
847+
}
845848

846849
// call(foo) retourne un int
847850
// call(bar) retourne un int&
@@ -853,7 +856,7 @@ auto main() -> int
853856
{
854857
decltype(auto) result = call(bar);
855858
return result;
856-
};
859+
}
857860
{% endhighlight %}
858861

859862
Avec cette initialisation de variable, il est possible de faire ceci:
@@ -946,16 +949,16 @@ for (const auto& [key, value] : map)
946949
Les classes/structures ayant **toutes leurs variables membres publiques** sont déstructurables avec une *structured binding declaration*:
947950

948951
{% highlight cpp linenos highlight_lines="10" %}
949-
struct Position2d
952+
struct Point2d
950953
{
951954
int x;
952955
int y;
953956
};
954957

955958
auto main() -> int
956959
{
957-
auto position = Position2d{10, 15}; // Construction d'un Position2d avec x vallant 10 et y vallant 15
958-
auto [x, y] = position; // Extraction des variables membre de Position2d
960+
auto position = Point2d{10, 15}; // Construction d'un Point2d avec x vallant 10 et y vallant 15
961+
auto [x, y] = position; // Extraction des variables membre de Point2d
959962
std::println("{} {}", x, y); // Affiche: "10 15"
960963
}
961964
{% endhighlight %}
@@ -964,15 +967,15 @@ La déstructuration doit **respecter l'ordre des paramètres**.<br>
964967
**Leur nom n'a pas d'importance**, il peut être changé. Par exemple: ``auto [foo, bar] = position;``
965968

966969
{% highlight cpp linenos highlight_lines="10" %}
967-
struct Position2d
970+
struct Point2d
968971
{
969972
int x;
970973
int y;
971974
};
972975

973976
auto main() -> int
974977
{
975-
auto position = Position2d{10, 15};
978+
auto position = Point2d{10, 15};
976979
auto [a, b] = position;
977980
std::println("{} {}", a, b); // Affiche: "10 15" malgré l'utilisation de noms de variables différents
978981
}
@@ -982,10 +985,10 @@ auto main() -> int
982985
Ceci est également valable pour [chaque type cité ci-dessous](#c-like-array)
983986

984987
{% highlight cpp %}
985-
auto position = Position2d{10, 15};
986-
auto [x] = position; // error: type 'Position2d' decomposes into 2 elements, but only 1 name was provided
988+
auto position = Point2d{10, 15};
989+
auto [x] = position; // error: type 'Point2d' decomposes into 2 elements, but only 1 name was provided
987990
auto [x, y] = position; // Ok
988-
auto [x, y, z] = position; // error: type 'Position2d' decomposes into 2 elements, but 3 names were provided
991+
auto [x, y, z] = position; // error: type 'Point2d' decomposes into 2 elements, but 3 names were provided
989992
{% endhighlight %}
990993

991994
### Propriétés cvref
@@ -1416,7 +1419,7 @@ template<class Lhs, class Rhs>
14161419
auto sum(Lhs lhs, Rhs rhs) -> auto
14171420
{
14181421
return lhs + rhs;
1419-
};
1422+
}
14201423
{% endhighlight %}
14211424

14221425
Depuis C++20, il est possible d'utiliser ``auto`` comme syntaxe alternative aux templates, améliorant grandement leur lisibilité:
@@ -1425,7 +1428,7 @@ Depuis C++20, il est possible d'utiliser ``auto`` comme syntaxe alternative aux
14251428
auto sum(auto lhs, auto rhs) -> auto
14261429
{
14271430
return lhs + rhs;
1428-
};
1431+
}
14291432
{% endhighlight %}
14301433

14311434
> Attention, derrière ses airs de [placeholder type specifiers](#placeholder-type-specifiers-depuis-c11), il s'agit ici bien de **types templatés**.<br>
@@ -1444,7 +1447,7 @@ Comme avec les templates, il est toujours possible de faire des *variadic templa
14441447
auto sum(auto... types) -> auto
14451448
{
14461449
return (types + ...);
1447-
};
1450+
}
14481451
{% endhighlight %}
14491452

14501453
Lorsque templates et paramètres ``auto`` sont combinés, cela équivaut à avoir les types des paramètres ``auto`` après les templates:
@@ -1494,7 +1497,7 @@ A première vue on pourrait penser que ça ne répond à aucun besoin réel.<br>
14941497
Mais regardons [la motivation](https://www.open-std.org/jtc1/sc22/wg21/docs/papers/2021/p0849r8.html#Motivation) derrière cet ajout:
14951498

14961499
Prenons le code suivant, dans lequel on veut supprimer toute occurrence de la première valeur (``"A"``):
1497-
{% highlight cpp highlight_lines="3" %}
1500+
{% highlight cpp linenos highlight_lines="3" %}
14981501
void erase_all_of_first(auto& container)
14991502
{
15001503
std::erase(container, container.front());
@@ -1522,7 +1525,7 @@ constexpr typename std::vector<T, Alloc>::size_type erase(std::vector<T, Alloc>&
15221525
Elle prend une **référence** sur un ``std::vector`` ainsi qu'une **référence constante** sur l'élément à rechercher et **à supprimer** dans le conteneur.
15231526

15241527
[La documentation](https://en.cppreference.com/w/cpp/container/vector/erase2) nous dit que la fonction [``std::erase``](https://en.cppreference.com/w/cpp/container/vector/erase2) supprime chaque élément du conteneur ``c`` égal à l'argument ``value`` de la manière suivante:
1525-
{% highlight cpp %}
1528+
{% highlight cpp linenos %}
15261529
auto it = std::remove(c.begin(), c.end(), value);
15271530
auto r = c.end() - it;
15281531
c.erase(it, c.end());
@@ -1541,7 +1544,7 @@ std::erase(container, auto{container.front()});
15411544
{% endhighlight %}
15421545

15431546
Ce qui nous donne:
1544-
{% highlight cpp highlight_lines="3" %}
1547+
{% highlight cpp linenos highlight_lines="3" %}
15451548
void erase_all_of_first(auto& container)
15461549
{
15471550
std::erase(container, auto{container.front()});

0 commit comments

Comments
 (0)