2012-06-02 1 views
3

Может кто-нибудь объяснить мне, почему следующее не работает (test is const внутри blub). Поскольку test копируется значением, которое я предполагал, я мог бы установить его, так как он является функторным.Нет присвоения копии по значению в лямбда

#include <memory> 

int main() 
{ 
    std::shared_ptr<bool> test; 
    auto blub = [test]() { 
     test = std::make_shared<bool>(false); 
    }; 

    return 0; 
} 

Чтобы сделать эту работу, сначала я должен ввести новый shared_ptr, назначать test, а затем я могу нормально назначить другую shared_ptr. BTW: Я использую clang 3.1

ответ

7

Потому что operator() lambdas - const по умолчанию. Вы должны использовать mutable ключевое слово, чтобы сделать его неконстантным:

auto blub = [test]() mutable { 
    test = std::make_shared<bool>(false); 
}; 
+0

Итак, 'const' вы имеете в виду всех захваченных значений сопзЬ - или только копию по значению? – abergmeier

+0

Так же, как с помощью написанного вручную объекта функции, только те, которые были захвачены по значению. Захваты являются членами лямбда, и оператор объявляется как «Оператор результата()() const; –