47 votes

Quand dois-je utiliser [[peut-être_unused]]?

Pourquoi utiliser [[maybe_unused]] ? Considérer

 int winmain(int instance, int /*prevInstance*/, const char */*cmdline*/, int show);

int winmain(int instance, [[maybe_unused]] int prevInstance, [[maybe_unused]] const char *cmdline, int show);
 

Certains pourraient insister sur le fait que l'utilisation de commentaires est moche, car ce mot clé a été créé et destiné à être utilisé dans ces circonstances, et je suis totalement d'accord avec cela, mais les mots clés maybe_unused me semblent un peu trop longs, ce qui rend le code légèrement plus difficile à lire.

Je voudrais suivre la norme aussi "strictement" que possible, mais cela vaut-il la peine d'être utilisé?

100voto

Baum mit Augen Points 3571

Si le paramètre est certainement inutilisés, [[maybe_unused]] n'est pas particulièrement utile, sans nom, les paramètres et les commentaires fonctionnent très bien pour ça.

[[maybe_unused]] est surtout utile pour des choses qui sont potentiellement utilisés, comme dans

void fun(int i, int j) {
    assert(i < j);
    // j not used here anymore
}

Cela ne peut pas être traitées avec des paramètres non nommés, mais si NDEBUG est défini, va produire un avertissement, car j n'est pas utilisé.

Des situations similaires peuvent se produire lorsqu'un paramètre est utilisé uniquement pour (potentiellement désactivé), l'exploitation.

75voto

StoryTeller Points 6139

Baum mit Augen la réponse est définitive et incontestable explication. Je veux juste présenter un autre exemple, qui ne nécessite pas de macros. Plus précisément, C++17 introduit l' constexpr if construire. Donc vous pouvez voir le modèle de code qui ressemble à ceci (barre de la bêtise, de la fonctionnalité):

#include <type_traits>

template<typename T>
auto add_or_double(T t1, T t2) noexcept {
    if constexpr (std::is_same_v<T, int>)
        return t1 + t2;
    else
        return t1 * 2.0;
}

int main(){
    add_or_double(1, 2);
    add_or_double(1.0, 2.0);
}

Comme de l'écriture, GCC 8.0.1 me prévient à propos de t2 étant inutilisés lorsque la branche else est instanciée une. L'attribut est indispensable, dans un cas comme celui-ci aussi.

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