下面的函数是有效的(截至C++20):
即使
但如果我尝试在新的lambda中捕获更复杂的东西:
这段代码无法编译。为什么?编译器应该可以轻松地从 lambda 内部调用 l1,那么为什么 b 对于无捕获的捕获是可以的,而 l1 不行呢? 在 GodBolt 上查看此问题。
void foo() {
constexpr const int b { 123 };
constexpr const auto l1 = [](int a) { return b * a; };
(void) l1;
}
即使
l1
没有捕获任何内容,据说它仍然可以“无捕获捕获”b
的值,因为它是一个const
(它甚至不必是constexpr
;但请参见@StoryTeller的评论)。但如果我尝试在新的lambda中捕获更复杂的东西:
void foo() {
constexpr const int b { 123 };
constexpr const auto l1 = [](int a) { return b * a; };
(void) [](int c) { return l1(c) * c; };
}
这段代码无法编译。为什么?编译器应该可以轻松地从 lambda 内部调用 l1,那么为什么 b 对于无捕获的捕获是可以的,而 l1 不行呢? 在 GodBolt 上查看此问题。