gpt4 book ai didi

c++ - 为什么不允许通过 decltype(lamda) 定义对象,我该如何改进它?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:03:40 24 4
gpt4 key购买 nike

我在研究 lambda 表达式时遇到了这个问题:

#include <iostream>
using std::cout;

int main()
{
auto lam = [](int a){ cout<<"a"; };
decltype(lam) bb; // oop! deleted default constructor!
bb(1);
}

但是编译器如上评论的那样提示。据我所知,lambda 是一个未命名类的对象。所以我想这个片段可以工作。

我在哪里犯了错误,我可以改进吗? A lambda 有什么样的构造函数?有没有像decltype(lambda) object(args...) 这样的非默认构造函数?

最佳答案

lambda 作为类实现的事实并不是程序员真正关心的任何问题。你不应该知道/关心/考虑那个。推而广之,它是否有默认构造函数,或者为什么有/没有,与我们的日常生活无关。

碰巧的是,它目前没有:

[C++14: expr.prim.lambda/20]: The closure type associated with a lambda-expression has a deleted (8.4.3) default constructor and a deleted copy assignment operator. It has an implicitly-declared copy constructor (12.8) and may have an implicitly-declared move constructor (12.8). [..]

[C++17: expr.prim.lambda/11]: The closure type associated with a lambda-expression has no default constructor and a deleted copy assignment operator. It has a defaulted copy constructor and a defaulted move constructor. [..]

但是!这将 change in C++20 ,如文档 P0624r2 中所述.据我所知,您的代码将根据该标准( as long as you don't add any captures to it )变得有效。

但是,现在,如果您想存储函数,请使用 std::function:

#include <iostream>
#include <functional>

int main()
{
std::function<void(int)> bb;
bb = [](int a) { std::cout << a << '\n'; };

// (time passes)
bb(1);
}

( live demo )

免责声明:这是一个人为的例子。在上面的代码中,您不会承担std::function 的开销;您只需按照原始代码执行 auto lam = ... 即可。但无论出于何种原因,OP 都表明需要将其复制到一个新的、可默认构造的对象中。这就是我展示的方法。

关于c++ - 为什么不允许通过 decltype(lamda) 定义对象,我该如何改进它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49185106/

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