Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套lambda语法和调用?_C++_C++11_Lambda - Fatal编程技术网

C++ 嵌套lambda语法和调用?

C++ 嵌套lambda语法和调用?,c++,c++11,lambda,C++,C++11,Lambda,我不知道如何命名标题,希望它是正确的 我无意中发现了下面的lambda定义,并且不理解语法,var=[=]和return[=]的含义是什么 还有下面consteprlambda()函数中的第二个问题,为什么我们不能调用add(1,2)而不是add(1,2)(为什么需要额外的(),而在调用identity(123)时,代码没有使用额外的() 问题放在准则的注释中 auto identity = [](int n) constexpr { return n; }; constexpr au

我不知道如何命名标题,希望它是正确的

我无意中发现了下面的lambda定义,并且不理解语法,
var=[=]
return[=]
的含义是什么

还有下面
consteprlambda()
函数中的第二个问题,为什么我们不能调用
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?
}
示例取自

类型 让我们从类型开始

auto identity = [](int n) constexpr
{
    return n;
};
这里的
identity
是一个包装器,它存储类型为
lambda(int)
的可调用文件。 您也可以使用std::function:

std::function<int(int)> identity;
std::函数标识;
因此,
identity
获取一个
int
并在调用它时返回一个
int

add
另一方面,调用时,获取两个
int
s并返回一个可调用的

额外()运算符 您需要调用
add(1,2)
,因为
add
的返回类型是可调用的,否则由于类型不匹配,您无法进行
add(1,2)(==3
比较


查看live on的类型(在上面的add函数中)是否意味着
返回[=]
自动T=[=]{}
实际上是嵌套的lambda(lambda中的lambda)?@metablaster add是返回另一个lambda的lambda。[=]表示按值捕获。