3

以下のコード例では、オーバーロードされた operator< は const 修飾されておらず、Visual C++ (2013 Preview までのすべてのバージョン) でコンパイルされますが、Clang ではエラーがスローされます - 注: 候補関数は実行可能ではありません: 'this' 引数タイプは「const Entry」ですが、メソッドは const bool operator<( const Entry& other ) とマークされていません。

#include "stdafx.h"
#include <vector>
#include <algorithm>

struct Entry
{
    unsigned int age;
    bool operator<( const Entry& other ) // !!! no const qualification here !!!
    {
        return age < other.age;
    }
};

int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<Entry> entries;
    for( unsigned int i = 0; i < 100; ++i )
    {
        Entry entry;
        entry.age = i;
        entries.push_back( entry );
    }
    // Sort by age
    std::sort( entries.begin(), entries.end() );
    return 0;
}

Visual C++ は、比較/関係演算子の const の正確性を強制する際に標準に準拠していませんか? または、これは std::sort と関係がありますか?

4

1 に答える 1

3

C++ 標準では、非定数関数は参照解除されたイテレータを介して適用されないことが想定されていると述べていCompareますsort

Compare関数オブジェクト型 (20.8) です。タイプ のオブジェクトに適用された関数呼び出し操作の戻り値は、Compareコンテキストに基づいて bool (4) に変換されると、呼び出しの最初の引数が 2 番目の引数より小さい場合は true になり、そうでない場合は false になります。Compare comp順序関係を仮定するアルゴリズム全体で使用されます。逆参照された iterator を介して非定数関数を適用しないと想定されcompます。

(私のものを強調)

そして、 と の間の関係を述べると、次のようにCompareなりoperator<ます。

を使用するすべてのアルゴリズムCompareには、代わりに を使用するバージョンがありますoperator<。つまり、comp(*i, *j) != falseデフォルトは*i < *j != falseです。25.4.3 で説明されているもの以外のアルゴリズムが正しく機能compするためには、値に対して厳密な弱い順序付けを誘導する必要があります。

どちらも からの引用です。25.4ソートおよび関連操作から。

operator<したがって、メンバーがである必要があると明示的に述べられていませんが、メンバーconstであるという仮定は、そうでなければならないことを意味します。に制限を設けて、 に制限を設けることは意味がcompありませんoperator<

Visual C++ は、逆参照された反復子で非 const 関数を呼び出すことができるため、ここで問題があると言えます。

于 2013-07-13T16:05:29.033 に答える