70 votes

Pedantic gcc warning: qualificatifs de type sur le type de retour de fonction

Lorsque j'ai compilé mon code C++ avec GCC 4.3 pour la première fois (après avoir compilé avec succès avec pas d'avertissements sur 4.1, 4.0, 3.4 avec l' -Wall -Wextra options) j'ai soudain eu une série d'erreurs de la forme warning: type qualifiers ignored on function return type.

Envisager temp.cpp:

class Something
{
public:
    const int getConstThing() const {
        return _cMyInt;
    }
    const int getNonconstThing() const {
        return _myInt;
    }

    const int& getConstReference() const {
        return _myInt;
    }
    int& getNonconstReference() {
        return _myInt;
    }

    void setInt(const int newValue) {
        _myInt = newValue;
    }

    Something() : _cMyInt( 3 ) {
        _myInt = 2;
    }
private:
    const int _cMyInt;
    int _myInt;
};

L'exécution g++ temp.cpp -Wextra -c -o blah.o:

temp.cpp:4: warning: type qualifiers ignored on function return type
temp.cpp:7: warning: type qualifiers ignored on function return type

Quelqu'un peut-il me dire ce que je fais de mal qui viole la norme C++? Je suppose que lors du retour en valeur, le leader de l' const est superflu, mais je vais avoir du mal à comprendre pourquoi il est nécessaire de générer un message d'avertissement avec elle. Existe-il d'autres endroits où je devrais laisser tomber le const?

95voto

Rob Kennedy Points 107381

Cela ne viole pas la norme. C'est pourquoi ce sont des avertissements et non des erreurs .

Et en effet, vous avez raison - les premiers const sont superflus. Le compilateur vous avertit parce que vous avez ajouté du code qui, dans d'autres circonstances, pourrait vouloir dire quelque chose, mais dans ce cas ne veut rien dire, et il veut être sûr que vous ne serez pas déçu plus tard lorsque vos valeurs de retour s'avéreront finalement modifiables.

20voto

ccaughie Points 276

J'ai rencontré cet avertissement lors de la compilation de code utilisant Boost.ProgramOptions. J'utilise -Werror donc l'avertissement tue ma construction, mais parce que la source de l'avertissement se trouvait dans les profondeurs de Boost, je ne pouvais pas m'en débarrasser en modifiant mon code.

Après de longues recherches, j'ai trouvé l'option du compilateur qui désactive l'avertissement:

Qualificatifs non ignorés

J'espère que cela t'aides.

2voto

mcbulba Points 21

Avoir cette

struct Foo { Foo(int) {} operator bool() { return true; } };

et que

Foo some_calculation(int a, int b) { Foo result(a + b); /*...*/ return result; }

l'exemple

if (some_calculation(3, 20) = 40) { /*...*/ }

compile sans avertissement. Bien sûr, cela est rare. Mais ce n'est pas const justesse au sujet de ce qui rend difficile pour les gens à faire des choses de mal? Et avec l'espoir que les gens d'essayer des choses, qui sont mauvais, le type de retour doit être déclarée const. Et: g++ prévient en ignorant le classificateur, mais ne pas l'ignorer. Je pense que, l'avertissement est les utilisateurs qui le copie, et d'ignorer la const classificateurs sur leur copie. Mais cela ne devrait pas être un avertissement, parce que ce n'est absolument comportement correct. Et il est logique de le faire.

1voto

Steve Points 11

La pédantique ne devrait-elle pas seulement permettre une stricte adhésion à la norme ISO? En fonction de -std = bien sur ...

1voto

Luchs Points 412

Cet avertissement est également utile pour éviter toute confusion lors de la déclaration de fonctions renvoyant des pointeurs sur des objets qui ne doivent pas être modifiés:

 // "warning: type qualifiers ignored on function return type"
// as the pointer is copied. 
Foo* const bar();

// correct:
const Foo* bar();
 

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