2016-08-13 76 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

''[&]'通过引用'a'获取,它在'return'语句后死亡 –

回答

4

不要通过引用捕获a,按值捕获它。原来,你在lambda中存储了一个悬挂引用,稍后使用它会导致UB。

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

感谢Quentin! – shaz

+0

@shaz我的荣幸:) – Quentin