2016-11-24 1 views
11

J'ai une classe personnalisée implémentant operator== avec nullptr.Pourquoi est-ce que je reçois un avertissement "paramétrage mais non utilisé" lors de l'utilisation de nullptr_t?

Voici mon code abêtis dans un exemple simple:

#include <cstdint> 
#include <iostream> 

class C { 
private: 
    void *v = nullptr; 

public: 
    explicit C(void *ptr) : v(ptr) { } 

    bool operator==(std::nullptr_t n) const { 
     return this->v == n; 
    } 
}; 

int main() 
{ 
    uint32_t x = 0; 
    C c(&x); 
    std::cout << (c == nullptr ? "yes" : "no") << std::endl; 

    C c2(nullptr); 
    std::cout << (c2 == nullptr ? "yes" : "no") << std::endl; 


    return 0; 
} 

Le code fonctionne comme prévu, mais g ++ (version 6.2.1) me donne l'avertissement suivant:

[[email protected] misc]$ g++ aaa.cpp -o aaa -Wall -Wextra 
aaa.cpp: In member function ‘bool C::operator==(std::nullptr_t) const’: 
aaa.cpp:12:36: warning: parameter ‘n’ set but not used [-Wunused-but-set-parameter] 
    bool operator==(std::nullptr_t n) const { 
            ^

Qu'est-ce que Je fais mal? REMARQUE: J'utilise -Wall -Wextra.

+0

Impossible de reproduire. Pas d'avertissement avec gcc 6.2.1 –

+3

@SamVarshavchik try -Wall -Wextra. Reproductible sur 6.1 de wandbox: http://melpon.org/wandbox/permlink/OGeniUkFzE8dRP1v – krzaq

+1

Intéressant. Notez que vous pouvez encore baisser davantage: '#include int main() {std :: nullptr_t n = nullptr; if (n == nullptr) std :: cout << "oui"; } ' –

Répondre

9

Pas vraiment une réponse sur pourquoi cela se produit, mais de toute façon quelle valeur pourrait avoir n mais nullptr?

De retour this->v == nullptr et en faisant l'argument sans nom supprime l'avertissement:

bool operator==(std::nullptr_t) const { 
    return this->v == nullptr; 
} 

EDIT:

Déclarant n comme référence rvalue, ou comme une référence const lvalue supprime également l'avertissement:

bool operator==(std::nullptr_t&& n) const { 
    return this->v == n; 
} 

bool operator==(const std::nullptr_t& n) const { 
    return this->v == n; 
} 

EDIT2:

Plus de façons de faire taire un avertissement sur les variables inutilisées peuvent être trouvées dans this question (thx @ShafikYaghmour pour le pointer dans les commentaires). Les exemples ci-dessus couvrent les moyens "implicites".

Des solutions explicites sont disponibles, mais IMHO semble moins cohérente puisque le paramètre est effectivement utilisé. Explicites solutions éprouvées comprennent:

bool operator==(std::nullptr_t n) const { 
    (void)n; 
    return this->v == n; 
} 

#define UNUSED(expr) do { (void)(expr); } while (0) 

bool operator==(std::nullptr_t n) const { 
    UNUSED(n); 
    return this->v == n; 
} 

solution non portable pour GCC:

bool operator==(__attribute__((unused)) std::nullptr_t n) const { 
    return this->v == n; 
} 
+2

Si ce n'est pas une réponse, alors OMI ça devrait être un commentaire. –

+7

Je crois réellement que * est * une réponse, car il fournit un moyen très raisonnable d'éviter l'avertissement. L'utilisation d'un identifiant pour un objet de type 'std :: nullptr_t' est inutile. – Angew

+1

Je suis d'accord, ceci est une réponse valide. –