0

今天我正在追赶 c++11(因为我们还没有继续前进)。正如很多人所说,切换的原因之一似乎是 lambda 表达式。我仍然不确定他们如何提供新的东西。

例如使用 c++11:

#include <iostream>

int main()
{
    auto func = [] () { std::cout << "Hello world" << std::endl; };

    func();
}

似乎非常类似于:

#include <iostream>

#define FUNC( )\
        do { std::cout << "Hello world" << std::endl; } while(0)


int main()
{
    FUNC();
}

lambda 表达式会为我提供什么我目前无法做到的?

4

2 回答 2

6

http://msdn.microsoft.com/en-us/library/vstudio/dd293608.aspx非常详细地总结了该主题的要点和更多内容。这是重要的摘录:

lambda 结合了函数指针和函数对象的优点并避免了它们的缺点。与函数对象一样,lambda 是灵活的并且可以维护状态,但与函数对象不同的是,它的紧凑语法不需要类定义。通过使用 lambda,您可以编写比等效函数对象的代码更简单、更不容易出错的代码。

网站上有一些例子显示了更多的差异和比较。

另外......传统的智慧是永远不要在 C++ 中使用宏:

http://scienceblogs.com/goodmath/2007/12/17/macros-why-theyre-evil/

于 2013-01-22T15:05:42.630 回答
1

与标准算法一起使用时,lambda 的一个不太明显的好处是程序员不需要为 lambda 函数考虑名称,并且命名事物被认为是编程中的一项艰巨任务

此外,通过标准算法执行的代码通常用于在提供的范围内的每个对象上调用成员函数,使用仿函数或函数的名称,通常只是模仿被调用的成员函数的名称,并且没有增加代码的可读性。人为的例子:

struct object
{
    void execute() const {}
};

void run_execute(object const& o) { o.execute(); }

std::vector<object> v;

std::for_each(v.begin(), v.end(), run_execute);

std::for_each(v.begin(), v.end(), [](object const& o) { o.execute(); });

诚然,这是一个小好处,但仍然令人愉快。

于 2013-01-24T09:12:18.527 回答