2016-08-13 3 views
2
#include <iostream> 

typedef std::function<bool(int)> set; 

using namespace std; 

set singletonSet(int a) { 
    return [&] (int x) { return (a == x); }; 
} 

bool contains(set s, int test) { 
    return s(test); 
} 


int main() { 
    auto first = singletonSet(5); 

    auto r1 = contains(first, 10); 
    auto r2 = contains(first, 5); 

    cout << r1 << " " << r2 << endl; 

    return 0; 
} 

を返す私は、これは0 1を印刷することを期待したが、これは基本的なエラーの場合、結果は1 1C++のstd ::関数は、予期しない値に

初級C++ labmdaプログラマ、ここで事前にとても残念です。

+2

'[&]'は、 'return'ステートメントの後に死ぬ' a'を参照してキャプチャします。 –

答えて

4

aを参照してキャプチャしないでください。値でキャプチャしてください。そのままで、ラムダの中にぶら下がっている参照を格納していて、後でそれを使用するとUBにつながります。

set singletonSet(int a) { 
    return [=] (int x) { return (a == x); }; 
    // ^
} 
+0

Thanks Quentin! – shaz

+0

@shaz私の喜び:) – Quentin

関連する問題