6
struct CCompare
{
    const bool operator()(const int& lhs, const int& rhs) const {
        return lhs < rhs;
    }
};

警告 1 警告 C4180: 関数型に適用された修飾子には意味がありません。

const boolプログラミングの本のように戻り値を使った使い方を見ました。上記のコードを vs2010 でコンパイルすると、警告 C4180 が報告されます。

代わりに、次のコードでは同じ警告は発生しません。

struct CCompare
{
    bool operator()(const int& lhs, const int& rhs) const {
        return lhs < rhs;
    }
};

質問1 > をconst Fundamental_Data_Types関数の戻り値として使用する意味がないというのは本当ですか?

質問2 >const Type関数の戻り値としての使用は、Type がクラス/構造体である場合にのみ意味があるというのは本当ですか?

ありがとうございました

// アップデート //

struct CClass
{
    int val;
    CClass(int _val) : val(_val) {}

    void SetValue(int _val) {
        val = _val;
    }
};

struct CCompare
{
    const CClass getMe() const {
        return CClass(10);
    }

    CClass getMeB() const {
        return CClass(10);
    }
};

int main(/*int argc, char *argv[]*/) 
{
    CCompare c;

    c.getMe().SetValue(20);   // error
    c.getMeB().SetValue(20);  // ok
}
4

1 に答える 1

7

はい、両方の質問にはい。戻り値は右辺値であり、cv 修飾子は、クラス型がある場合にのみ右辺値に適用されます。

この理由は非常に単純です。通常、const 性が違いを生む右辺値でできることは何もありません。結局のところ、右辺値はオブジェクトではなく値です。クラス型では、考慮すべきメンバー関数があるため (つまり、右辺値から左辺値を取得できることを意味します)、const-ness が突然関連するようになります。

于 2013-07-08T14:41:19.187 に答える