【问题标题】:using c++11 placeholders as lambdas?使用 c++11 占位符作为 lambdas?
【发布时间】:2013-01-03 07:45:10
【问题描述】:

在尝试 C++11 新特性时,我发现 std::placeholders::_1 不能直接用作 lambda:

#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);
}

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 的版本,它编译得很好。

为什么这不适用于标准版本?有没有办法让它工作或者我必须在这里使用一个丑陋的 lambda?

transform(a, a+5, a, [](int i){return i*2;});

【问题讨论】:

    标签: c++ boost c++11 lambda placeholder


    【解决方案1】:

    Boost 实际上有许多 _1 占位符。来自 Boost.Bind 的那些(或多或少并入 C++11)、来自 Boost.Lambda 的那些,甚至来自 Lambda 的继任者 Boost.Phoenix 的那些。

    Lambda 和 Phoenix 版本是 唯一 可用于自行创建函子的占位符。 Boost.Bind _1 占位符不能,这就是标准化的。 Lambda 和 Phoenix 是将表达式转换为函数的方法; Bind 就是一个简单的函数绑定和参数调整系统。

    【讨论】:

    • 我明白了。使用新的 lambda 系统实现等效的 Boost:lambda/phoenix 会很难/不好?
    • @ogoid:嗯,什么新的 lambda 系统?另外,您问的是一个完全不同的问题。
    • @ogoid:重新发明 Boost.Lambda 对我来说非常困难,不过我不了解你。
    • 对不起,我说的是 boost 的占位符。但我想我会坚持使用有些笨拙的 lambda 语法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 2013-01-11
    • 2014-07-31
    • 2017-07-23
    相关资源
    最近更新 更多