C ++ 17 introduit l' [[nodiscard]]
attribut, qui permet aux programmeurs de marquer les fonctions de manière à ce que le compilateur génère un avertissement si l'objet renvoyé est ignoré par un appelant. le même attribut peut être ajouté à un type de classe entier.
J'ai lu des explications sur la motivation de cette fonctionnalité dans la proposition d' origine et je sais que C ++ 20 ajoutera l'attribut à des fonctions standard telles que std::vector::empty
, dont les noms ne transmettent pas une signification non ambiguë concernant la valeur de retour.
C'est une fonctionnalité intéressante et utile. En fait, cela semble presque trop utile. Partout où je lis [[nodiscard]]
, les gens en discutent comme si vous ajoutiez simplement cela à quelques fonctions ou types et oubliez le reste. Mais pourquoi une valeur non éliminable devrait-elle constituer un cas particulier, en particulier lors de l'écriture d'un nouveau code? Une valeur de retour supprimée n'est-elle pas généralement un bogue ou du moins un gaspillage de ressources?
Et l’un des principes de conception de C ++ n’est-il pas que le compilateur doit intercepter autant d’erreurs que possible?
Si tel est le cas, pourquoi ne pas ajouter [[nodiscard]]
votre propre code, non hérité, à presque chaque void
type de classe et à chaque type de fonction?
J'ai essayé de le faire dans mon propre code, et cela fonctionne bien, sauf que c'est tellement terriblement prolixe que ça commence à ressembler à Java. Il semblerait beaucoup plus naturel de mettre les compilateurs en garde contre les valeurs renvoyées par défaut, à l' exception des rares cas où vous indiquez votre intention [*] .
Comme je n’ai vu aucune discussion sur cette possibilité dans les propositions standard, les entrées de blog, les questions Stack Overflow ou ailleurs sur Internet, il me manque quelque chose.
Pourquoi une telle mécanique n'aurait-elle pas de sens dans le nouveau code C ++? La verbosité est-elle la seule raison de ne pas utiliser [[nodiscard]]
presque partout?
[*] En théorie, vous pouvez avoir quelque chose comme un [[maydiscard]]
attribut, qui pourrait aussi être ajouté rétroactivement à des fonctions comme printf
dans les implémentations de bibliothèques standard.
const
peut enfler une autre « simple » classe (ou plutôt « bon vieux objet de données ») considérablement en C ++.
std::vector
ou std::unique_ptr
dont vous avez simplement besoin de données membres dans votre définition de classe. J'ai travaillé avec les deux langues. Java est une langue okayish, mais plus verbeuse.
operator =
par exemple. Etstd::map::insert
.