Вложенный лямбда-синтаксис и вызов? - PullRequest
2 голосов
/ 06 октября 2019

Я не знал, как назвать название, надеюсь, оно правильное ...

Я наткнулся на нижнее лямбда-определение и не понимаю синтаксис, в чем смысл var = [=] иreturn [=]?

также второй вопрос в функции ConstexprLambda(), приведенной ниже, почему мы не можем вызвать add(1, 2) вместо add(1, 2)(), зачем нужны дополнительные () во время вызова identity(123)в коде не используются дополнительные ()?

вопрос (ы), помещенный в комментарии к коду.

auto identity = [](int n) constexpr
{
    return n;
};

constexpr auto add = [](int x, int y)
{
    auto L = [=] // what is = [=]?
    {
        return x;
    };
    auto R = [=]
    {
        return y;
    };
    return [=] // what return [=] means here?
    {
        return L() + R();
    };
};

void ConstexprLambda()
{
    static_assert(identity(123) == 123);
    static_assert(add(1, 2)() == 3); // why can't we just add(1,2) like above?
}

Пример взят из здесь

1 Ответ

1 голос
/ 06 октября 2019

types

Давайте начнем с типа

auto identity = [](int n) constexpr
{
    return n;
};

Здесь identity - это оболочка, в которой хранится вызываемый типа lambda(int). Вы также можете использовать std :: function:

std::function<int(int)> identity;

Так что identity берет int и возвращает int при его вызове.

add на другомhand, когда вызывается, берет два int s и возвращает вызываемый.

extra () operator

Вам нужно вызвать add(1, 2), потому что тип возврата add является вызываемым,в противном случае вы не сможете выполнить сравнение add(1, 2)() == 3 из-за несоответствия типов.

см. типы, живущие на godbolt

...