2015-11-09 6 views
5

は、私が(本当に、よく、型変換)のstd :: LOWER_BOUND()とstd :: UPPER_BOUND()構文での矛盾のように見えるものを見て、誰でもしてください解明できれば不思議でしたか?コメントごとに、1行目との明白な類似性にもかかわらず2行目はコンパイルされません。あなたは、3行目に示された形を使用する必要があります(少なくとも、GCC 4.7.3/Ubuntuの上で64ビットを - それは私がと遊ぶために持っているすべてです)UPPER_BOUNDとLOWER_BOUND一貫性のない値要件

#include <set> 
#include <algorithm> 

using namespace std; 

class MyInt { 
    private: 
    int val; 
    public: 
    MyInt(int _val): val(_val) {} 
    bool operator<(const MyInt& other) const {return val < other.val;} 
}; 

int main() { 
    set<MyInt> s; 
    s.insert(1); // demonstrate implicit conversion works 
    s.insert(MyInt(2)); 
    s.insert(3); // one last one for the road 
    set<MyInt>::iterator itL = lower_bound(s.begin(), s.end(), 2); //LINE 1 
    // the line below will NOT compile 
    set<MyInt>::iterator itU = upper_bound(s.begin(), s.end(), 2); //LINE 2 
    // the line below WILL compile 
    set<MyInt>::iterator itU2 = upper_bound(s.begin(), s.end(), MyInt(2)); // LINE 3 
    return 0; 
} 
+0

同じ動作。間違いなくg ++バグです。 –

答えて

5

私はそれはバグだとは思いません。あなたは(possible) implementation of std::upper_boundを見れば、比較は

if (!(value < *it)) { ... } // upper_bound, implicit conversion `MyInt`->`int` doesn't work 

のように行われ、operator<は(クラス型ではなく、ないintの、)MyIntのメンバ関数であるので、コードがあるため、コンパイルされません。 MyIntからintへの変換はありません。一方、std::lower_boundに、*it比較のLHSに表示され、MyInt::operator<に渡されたときに(タイプintの)valueを暗黙MyIntに変換することができます。

if (*it < value) { ... } // lower_bound, implicit conversion `int`->`MyInt` works 

これは、あなたがこの非対称性を持っていないので、非会員としての比較演算子を実装する方が良いでしょう理由です。 項目24:型変換はすべてのパラメータに適用する際に非メンバ関数を宣言しますこれは、スコット・マイヤーズEffective C++ブックに記載されています。

クイックと汚い修正:intへの暗黙的な変換MyIntためMyInt::operator int(){return val;}を定義します。 (EDIT:が実際に動作しない、曖昧)。暗黙の変換の必要性を取り除くことが効果的です。

set<MyInt>::iterator itU = upper_bound(s.begin(), s.end(), MyInt(2)); 

ここでG ++ 4.8.4と

+0

ありがとう、ありがとう!興味深いことに、(おそらく)STLの実装はインターフェイスを混乱させます。ところで – aho

+0

@ahoはい、超良い理由、偉大な質問を暗黙の型変換を嫌うためにさらに別の理由。 'のstd ::私たち私たちは、その後比較して、後者を使用し、' * it'への[値]から、追加の変換を実行し、一時的にそれを格納する場合upper_bound'はおそらく「固定」することができます。この場合、振る舞いは 'std :: lower_bound'とまったく似ており、支払う価格はありません(コードをコンパイルするにはどうにもならない)。 – vsoftco

関連する問題