【发布时间】:2023-03-13 00:30:01
【问题描述】:
我想知道如何以这种方式使用带有已删除默认构造函数的 lambda:
[](){}; // how is this translated by the compiler?
但这不起作用:
auto l = [](){std::cout << "lambda expr\n";}; // which ctor is invoked?
decltype (l) g; // doesn't work
因为在 C++ 20 之前它不起作用,但 C++ 20 使 lambda 默认可构造。
如果没有可调用的构造函数,该对象是如何存在的?
【问题讨论】:
-
"
[](){}; // how is this translated by the compiler?" - 放入godbolt.org或者反汇编生成的二进制文件就知道了。 -
我不太明白你的问题。以前没有可调用的默认 ctor,现在有了。有问题吗?你是在问编译器是如何在之前说我们可以使用ctor的? Lambda 很神奇,伙计!编译器作者使用什么源代码来使它工作真的不重要吗?
-
@AsteroidsWithWings:我很清楚:我在 C++11 标准中说过,它说一个不捕获任何对象的 lamda 则 lambda 有一个已删除的默认 ctor,因此在这样的表达式中如何可以在删除 default-ctor 的同时构造闭包:
[]{}? -
从 lambda 表达式创建 lambda 对象时,编译器不需要调用默认 c'tor。它很可能有特殊的逻辑。您可能会感到沮丧,但它之所以有效,是因为 C++ 标准说它应该有效,而编译器编写者使之成为现实。
-
这也不是以这种方式工作的唯一实例。
std::initializer_list是 limited in how user programs can construct it。然而,标准规定{1, 2, 3}可以简单地变成std::initializer_list。