Используя С++ 11 заполнителей в качестве лямбда?

Во время экспериментов с новыми возможностями С++ 11 я обнаружил, что std:: placeholders:: _ 1 не может быть непосредственно использован как lambdas:

#include <algorithm>
#include <functional>
// #include <boost lambda="" lambda.hpp="">
using namespace std;
// using boost::lambda::_1;
using std::placeholders::_1;
int main()
{
 int a[] = {1,2,3,4,5};
 transform(a, a+5, a, _1 * 2);
}
</boost></functional></algorithm>

Ошибка Clang 3.3:

tmp $ clang -std=c++11 -stdlib=libc++ -lc++ test.cpp
test.cpp:16:27: error: invalid operands to binary expression ('__ph<1>' and 'int')
 transform(a, a+5, a, _1 * 2);

Если я изменил его, чтобы использовать версию Boost, она компилируется отлично.

Почему это не работает со стандартной версией? Есть ли способ заставить его работать, или я должен использовать уродливую лямбду здесь?

transform(a, a+5, a, [](int i){return i*2;});
1 ответ

У Boost на самом деле есть несколько заполнителей _1. Те из Boost.Bind(которые были более или менее включены в С++ 11), те из Boost.Lambda и даже те, кто был преемником Lambda Boost.*******.

Версии Lambda и ******* являются единственными заполнителями, которые могут быть использованы для создания функторов сами по себе. Заполнители Boost.Bind _1 не могут и что стандартизованы. Лямбда и Феникс - это способы превращения выражения в функцию; Bind - это просто функция привязки и корректировка параметров.

licensed under cc by-sa 3.0 with attribution.