复制 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;
这是注释,因为没有必要取消注释 - 编译器无论如何都会这样做。
这是一个带有 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;
这是注释,因为没有必要取消注释 - 编译器无论如何都会这样做。