2015-09-18 2 views
3

Почему этот код делает ошибку компиляции?Почему «авто» неприемлемо в качестве параметра лямбда

std::find_if(std::begin(some_list), std::end(some_list), [](const auto& item){ 
//some code 
}); 

Ошибка, конечно, при «авто»? почему невозможно узнать тип автоматически? спасибо

+3

Это * * является возможным, но это не входит в C++ 11. Однако он является частью [стандарта C++ 14] (https://en.wikipedia.org/wiki/C%2B%2B14#Generic_lambdas). –

+0

@JoachimPileborg Спасибо .. Я еще ничего не читал о версии C++ 14. Однако этой приятной способности достаточно, чтобы я мог двигаться дальше! –

ответ

7

Это потому, что с C++ 11 функции лямбда в C++ не могут быть определены в общем случае, поэтому вы не можете объявить параметр с помощью auto. Это было добавлено в C++ 14 (и уже поддерживается некоторыми компиляторами).

Однако, вы можете добиться того же в C++ 11 с помощью decltype(), в вас случае:

std::find_if(std::begin(some_list), std::end(some_list), [](decltype(*some_list.begin())& item){ 
     return item > 4; 
+0

Спасибо, это что-то вроде компиляции или времени выполнения? –

+3

Это время компиляции. – syntagma

+1

«Это будет добавлено в C++ 14» Ну, C++ 14 * - это последний стандарт C++. – edmz

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