2016-08-13 4 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++ станд :: функция возвращает неожиданное значение

Начинающий C++ программист labmda здесь так жаль заранее, если это основная ошибка.

+2

'[&]' захватывает по ссылке 'a', который умирает после' return' заявление –

ответ

4

Не снимайте a по ссылке, возьмите его по значению. Как есть, вы храните оборванную ссылку внутри лямбда, а ее использование позже приводит к UB.

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

Спасибо Квентин! – shaz

+0

@shaz мое удовольствие :) – Quentin

Смежные вопросы