复制 lambda 表达式的构造函数

Copy constructor of the lambda expression

这是一个带有 lambda 的玩具代码:

#include <cstdio>
#include <iostream>
#include <functional>

std::function<void(int)> func(const std::function<void(int)> f) {
  return f;
}

class A {
    int x{};
    public:
    A(int a): x(a) {
      std::cout << "A::constructor\n";
    }
    A(const A& obj) {
      std::cout << "A::copy_constructor\n";
    }
};

int main() {
    A p(3);    
    auto lam = [p](int a){ return p;};
    func(lam);
    auto lam1(lam);
    return 0;
}

这里是 cppinsights

生成的等效代码
#include <cstdio>
#include <iostream>
#include <functional>

std::function<void (int)> func(const std::function<void (int)> f)
{
  return std::function<void (int)>(f);
}


class A
{
  int x;
  
  public: 
  inline A(int a)
  : x{a}
  {
    std::operator<<(std::cout, "A::constructor\n");
  }
  
  inline A(const A & obj)
  : x{}
  {
    std::operator<<(std::cout, "A::copy_constructor\n");
  }
  
};
   
int main()
{
  A p = A(3);
    
  class __lambda_22_16
  {
    public: 
    inline A operator()(int a) const
    {
      return A(p);
    }
    
    private: 
    A p;
    public: 
    // inline __lambda_22_16(const __lambda_22_16 &) noexcept(false) = default;
    // inline __lambda_22_16(__lambda_22_16 &&) noexcept(false) = default;
    __lambda_22_16(const A & _p)
    : p{_p}
    {}
    
  };
  
  __lambda_22_16 lam = __lambda_22_16{p};
  func(std::function<void (int)>(__lambda_22_16(lam)));
  __lambda_22_16 lam1 = __lambda_22_16(lam); 
  return 0;
}

标准规定:

The copy constructor and the move constructor are declared as defaulted and may be implicitly-defined according to the usual rules for copy constructors and move constructors. cppreference.com

但我没有看到编译器为给定的 lambda 隐式生成的复制构造函数。 有人可以解释一下吗?

Cppinsight 不是标准的实现,它不会像编译器那样神奇地生成所有代码。它为 lambda 表达式显示的 class 使得编译器 生成一个复制构造函数。尽管如此,它还是给了你一个提示:

// inline __lambda_22_16(const __lambda_22_16 &) noexcept(false) = default;

这是注释,因为没有必要取消注释 - 编译器无论如何都会这样做。