gpt4 book ai didi

c++11 - Lambdas 成员是如何初始化的?

转载 作者:行者123 更新时间:2023-12-02 11:28:24 25 4
gpt4 key购买 nike

据说 lambda 的成员是在定义 lambda 时初始化的,而不是在创建该 lambda 的对象时初始化的。为了更多地理解这一点,我创建了一个函数 foo ,它打印一条简单的消息(检查稍后调用)并返回一个整数值(任意值。此处为 1024),用于初始化 lambda 的成员。

在 lambda 主体内,它会打印捕获的对象的值。

int foo() {
std::cout << "foo()" << std::endl;
return 1024;
}

int main() {

int x = 0;
[x = foo()]()mutable{ x = foo(); cout << "in un-named lambda x: " << x << endl; };
}

输出:

foo()

为什么我只得到 foo() 而不是:

foo()
foo()
in un-named lambda x: 1024
  • 这是否意味着 [x = foo()] 是初始化,而 {x = foo()} 是赋值?

最佳答案

因此,您的代码存在一些问题:

  • int x = 0;

    这个x从未使用过。见下文

  • [x = foo()]

    这不会捕获变量 xmain 。相反,它是 a generalized lambda capture 。如果您想考虑 lambda 的类类型等效项,它会创建一个名为 x 的成员。初始化为foo() 。同样,与变量 x 绝对没有联系。在主要部分。

  • [x = foo()]()mutable{ x = foo(); cout << "in un-named lambda x: " << x << endl; };

    最后你的 lambda 永远不会被调用。所以{ x = foo(); cout << "in un-named lambda x: " << x << endl; }永远不会被执行。

有一个很棒的工具,可以让您查看编译器对代码进行的转换:https://cppinsights.io/s/cd26f632

#include <iostream>

int foo()
{
std::operator<<(std::cout, "foo()").operator<<(std::endl);
return 1024;
}


int main()
{
int x = 0;

class __lambda_12_5
{
int x;
public:
inline /*constexpr */ void operator()()
{
x = foo();
std::operator<<(std::cout, "in un-named lambda x: ").operator<<(x).operator<<(std::endl);
}

public: __lambda_12_5(int _x)
: x{_x}
{}

} __lambda_12_5{foo()};

;
}
<小时/>

另外,请启用并注意您的警告:Why should I always enable compiler warnings?

source>:12:5: warning: expression result unused [-Wunused-value]

[x = foo()]()mutable{ x = foo(); std::cout << "in un-named lambda x: " << x > << std::endl; };

^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~> ~~~~~~~~~~

<source>:11:9: warning: unused variable 'x' [-Wunused-variable]

int x = 0;

^

2 warnings generated.

如您所见,您被告知未使用的变量和未调用的 lambda。

关于c++11 - Lambdas 成员是如何初始化的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57949104/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com