52 votes

Pourquoi std::move n'est pas [[nodiscard]] en C++20 ?

J'ai lu récemment que [[nodiscard]] en C++17, et d'après ce que j'ai compris, c'est une nouvelle fonctionnalité (design by contract ?) qui vous oblige à utiliser la valeur de retour. Cela a du sens pour les fonctions controversées comme std::launder (nodiscard depuis C++20), mais je me demande pourquoi std::move n'est pas défini de la sorte en C++17/20. Connaissez-vous une bonne raison ou est-ce parce que C++20 n'est pas encore finalisé ?

1 votes

Je connais une raison qui me semble logique, mais à moins qu'un document officiel ne dise explicitement pourquoi ce n'est pas le cas, la question n'est plus qu'une question d'opinion.

0 votes

Pourquoi pensez-vous qu'il n'est pas nécessaire que std::move soit [[nodiscard]] ?

9 votes

Parce qu'il ne se passe absolument rien de mal (ou pas du tout) quand on ne l'utilise pas.

51voto

Barry Points 45207

L'équipe de la bibliothèque standard de MSVC a ajouté plusieurs milliers d'instances de [[nodiscard]] depuis VS 2017 15.6, et ont fait état d'un succès fou avec cette solution (à la fois en termes de découverte de nombreux bogues et d'absence de plaintes des utilisateurs). Les critères qu'ils ont décrits sont approximativement :

  1. Les purs observateurs, par exemple vector::size() , vector::empty et même std::count_if()
  2. Les choses qui acquièrent des ressources brutes, par ex. allocate()
  3. Les fonctions pour lesquelles le rejet de la valeur de retour est extrêmement susceptible de conduire à un code incorrect, par ex. std::remove()

MSVC marque les deux std::move() y std::forward() como [[nodiscard]] en suivant ces critères.

Bien qu'il ne soit pas officiellement annoté en tant que tel dans la norme, il semble offrir un avantage clair pour l'utilisateur et il s'agit plutôt de concevoir un tel document afin de marquer toutes les bonnes choses. [[nodiscard]] (encore une fois, plusieurs milliers d'instances de MSVC) et les appliquer - ce n'est pas un travail complexe en soi, mais le volume est important. Entre-temps, vous pouvez peut-être demander à votre fournisseur de bibliothèques standard préféré de [[nodiscard]] beaucoup de choses ?

32voto

cpplearner Points 1451

AFAIK P0600R1 est la seule proposition visant à ajouter [[nodiscard]] à la bibliothèque standard qui a été appliquée à C++20. Extrait de ce document :

Nous suggérons une approche conservatrice :

[...]

Il ne doit pas être ajouté lorsque :

  • [...]
  • ne pas utiliser la valeur de retour n'a aucun sens mais ne fait pas de mal et n'est généralement pas une erreur
  • [...]

Donc, [[nodiscard]] ne devrait pas signaler un mauvais code si ceci

  • [...]
  • ne fait pas mal et probablement aucun changement d'état n'a été signifié qui ne se produit pas

La raison en est que la bibliothèque standard utilise une approche conservatrice et qu'une approche plus agressive n'a pas encore été proposée.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X