std::set<T>::value_type
- это T const
, а не T
;следовательно, аргумент вашей лямбды должен быть типом значения (то есть, копировать) или int const&
(и технически, или int const volatile&
), а не int&
.То есть, это работает:
std::set<int> collection{2, 3, 4, 5435345, 2};
std::for_each(
collection.begin(),
collection.end(),
[](int const& i) { std::cout << i << std::endl; }
);
Бонусный вопрос: Также я хотел бы изменить int&
в аргументе лямбды на auto&
, почему это не может быть автоматическивыведено?
Потому что стандарт говорит, что не может;исторически, я считаю, что это было связано с чрезмерно сложным взаимодействием между лямбдами и понятиями (до того, как понятия были удалены из проекта). Тем не менее, я слышал слухи о том, что первые сообщения о дефектах в новый стандарт (C ++ 11) будут адресованы именно этому, так что, возможно, вы увидите поддержку этого, добавленную в выбранный вами компилятор, в следующем году илидва. РЕДАКТИРОВАТЬ : О, смотри, в C ++ 14 теперь есть полиморфные лямбды ...