2011-01-03 9 views
2

これが標準であるか、私のコードのバグかどうか疑問に思っていました。私は自家製の関数オブジェクトのペアを比較しようとしています。関数オブジェクトの型が同じでない場合、私は比較を拒否したので、2つのラムダが同じ型であることを知っています。だから彼らはなぜ比較できないのですか?ラムダを比較することはできません

+0

"自家栽培"と言うとき、operator()でクラスを明示的に宣言したことを意味しますか?または、新しいラムダ構文を使用しましたか? – templatetypedef

+0

@templatetypedef:それは、自分自身のバージョンのstd :: functionであり、継承と型の消去によって実装されています。 – Puppy

+0

あなたは正確に何を比較しようとしていますか? – sellibitze

答えて

3

シグネチャが同じでも、すべてのC++ 0x lambdaオブジェクトには異なるタイプがあります。

auto l1=[](){}; // one do-nothing lambda 
auto l2=[](){}; // and another 
l1=l2; // ERROR: l1 and l2 have distinct types 

2つのC++ 0x lambdaの型が同じである場合、それらは同じコード行から来ている必要があります。もちろん、変数を取り込む場合、異なる呼び出しから来た可能性があるため、必ずしも同一である必要はありません。

しかし、C++ 0x lambdaには比較演算子がないため、インスタンスを比較してそれらが実際に同じか、まったく同じかどうかを確認することはできません。キャプチャされた変数に比較演算子がない場合、各コピーにはキャプチャされた変数の値が異なる可能性があるため、その型のラムダを比較することはできません。

0

ラムダオブジェクトに等価演算子がオーバーロードされていますか?そうでなければ、私はそれを実装する必要があると仮定しています。

+0

質問のポイントは、私は1つが提供されるべきだと考えたということです。 – Puppy

+0

私は、比較演算子を実装する必要があると主張します。私は問題は、あなたが継承するとき、演算子を再定義する必要があると信じています。 – Achilles

+0

ラムダが何であるか知っていますか? @Deadはラムダを実装していないのでコンパイルはできません。 – GManNickG