85

C++コードをGCC4.3で初めてコンパイルしたとき(4.1、4.0、3.4で-Wall -Wextraオプションを指定して警告なしで正常にコンパイルした後)、突然、フォームのエラーが大量に発生しましたwarning: type qualifiers ignored on function return type

考えてみてください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;
};

実行中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

誰かが私が間違っていることを教えてもらえますか?それはC ++標準に違反していますか?値で返す場合、先頭constは不要だと思いますが、なぜ警告を出す必要があるのか​​理解できません。constをやめるべき他の場所はありますか?

4

8 に答える 8

110

規格に違反していません。そのため、エラーではなく警告です。

そして確かにあなたは正しいです - 先頭constは不要です。コンパイラは、他の状況では何かを意味するコードを追加したため、警告を発しますが、この状況では何の意味もなく、後で戻り値が変更可能であることが判明したときに失望しないようにしたいと考えています。

于 2009-07-15T21:43:32.617 に答える
20

Boost.ProgramOptions を使用するコードをコンパイルしているときに、この警告が表示されました。私-Werrorは警告が私のビルドを殺していたように使用しますが、警告の原因が Boost の奥深くにあったため、コードを変更してもそれを取り除くことができませんでした。

掘り下げた後、警告を無効にするコンパイラオプションを見つけました:

-Wno-ignored-qualifiers

お役に立てれば。

于 2009-08-19T09:34:54.867 に答える
2

これを持って

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

そしてそれ

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

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

警告なしでコンパイルします。もちろん、これはまれです。しかし、人々が間違ったことをするのを難しくすることについての const の正しさではありませんか? そして、人々が間違ったことを試みることを期待して、戻り値の型を const と宣言する必要があります。そして: g++ は分類子を無視することについて警告しますが、無視しません。警告は、コピーを取り、コピーの const 分類子を無視するユーザーに関するものだと思います。しかし、これは絶対に正しい動作であるため、警告ではありません。そして、これを行うことは理にかなっています。

于 2010-07-13T11:32:25.853 に答える
1

-pedantic は、ISO 標準への厳密な準拠のみを許可するべきではありませんか? もちろん -std= に応じて...

于 2011-02-13T23:55:42.780 に答える
1

この警告は、変更してはならないオブジェクトへのポインターを返す関数を宣言する際の混乱を避けるためにも役立ちます。

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

// correct:
const Foo* bar();
于 2014-04-07T12:06:45.867 に答える
0

const無視される基本型の結果と、const一般的に大混乱をもたらすクラス型の結果には違いがあります。

namespace i {
    auto f() -> int const { return 42; }
    void g( int&& ) {}
}

namespace s {
    struct S {};
    auto f() -> S const { return {}; }
    auto g( S&&  ) {}
}

auto main() -> int
{
    { using namespace i; g( f() ); }    // OK
    { using namespace s; g( f() ); }    // !The `const` prevents this.
}

これが、最初のケースでコンパイラが警告する理由です。これは特殊なケースであり、素朴に期待できることをしない可能性があります。

const現代のプログラミングでは、ムーブセマンティクスを禁止するため、クラスタイプの結果について警告することも良いでしょう。想像されたどんな小さな利点に対しても、かなり厳しい代償を払うことになります。

于 2016-03-29T10:31:09.693 に答える
-5

スコットマイヤーズは、誰かが値を返したいと思う理由はかなりあると指摘しましたconst。次に例を示します。

int some_calculation(int a, int b) { int res = 0; /* ... */ return res; }

/* Test if the result of the calculation equals 40.*/
if (some_calculation(3,20) = 40)
{

}

私が間違ったことを理解できますか?このコードは絶対に正しいので、コンパイルする必要があります。問題は、値を割り当てる代わりに、比較しようとしていることをコンパイラーが理解しなかったことです40

戻り値があるconst場合、上記の例はコンパイルされません。まあ、少なくともコンパイラがconstキーワードを破棄しないのであれば。

于 2010-04-20T12:16:12.807 に答える