如果将 lambda 声明为默认参数,每个调用站点的参数是否不同?

问题描述 投票:0回答:1
#include <iostream>

int foo(int x = [](){ static int x = 0; return ++x; }()) { return x; };

int main() {
    std::cout << foo() << foo(); // 1 2
}

我知道每次调用函数时都会评估默认参数。这是否意味着每次调用时 lambda 类型都不同?如果不是,请指出标准引用来解释为什么会这样。

c++ lambda language-lawyer default-arguments
1个回答
0
投票

这是否意味着每次调用时 lambda 类型都不同?

是的,这可以从 dcl.fct.defaultexpr.prim.lambda.closure 看出:

每次调用函数时都会评估默认参数,而对应的参数没有参数。 参数不得作为默认参数中的潜在计算表达式出现

lambda 表达式的类型(也是闭包对象的类型)是一种唯一的、未命名的非联合类类型,称为闭包类型,其属性如下所述。

© www.soinside.com 2019 - 2024. All rights reserved.