有理由使得带有空捕获列表的lambda无法默认构造吗?

9

C++的lambda表达式在需要函数对象的模板中非常方便,但遗憾的是,它们不能被默认构造。

正如这个问题所讨论的那样,对于有非空捕获列表的lambda表达式来说,这是有道理的。

通过类型实例化C++ lambda表达式

Kerrek解释道:

The code doesn't make sense. Imagine you have a capturing lambda like this:

{
    int n = 0;
    auto t = [&n](int a) -> int { return n += a; };
}

What could it possibly mean to default-construct an object of type decltype(t)?

空捕获列表的lambda表达式是否也无法进行默认构造?这是因为有什么理由呢?除了“标准规定”外还有什么其他原因吗?


如何默认构造一个未指定类型?当您可以将lambda分配给std :: function时,为什么要这样做? - 101010
2
@101010 在这个例子中,类型是decltype(t)。在这种情况下,Lambda比std::function更可取,因为std::function会引入不必要的间接性(我们知道我们想要什么函数,而且我们不会改变主意),而且Lambda定义可以直接放在使用它的地方。 - Praxeolitic
1个回答

4
一般来说,Lambda表达式只被尽可能少地指定以解决特定用例。其他可能有用的东西,例如“仅复制平凡可复制数据的lambda必须是平凡可复制的”,也被省略了。(标准没有规定lambda是否是平凡可复制的)。好处是使Lambda成为更容易实现的功能,这很重要。缺点是排除了某些不在“预期”范围内的用途。如果您认为“不捕获变量的lambda必须具有零参数构造函数”是一个重要的事情,请提出建议。但这将把Lambda的一个用途(轻松本地捕获和创建函数对象)转变为另一种形式(轻松创建可以传递类型的无状态函数对象)。

是否有来自未参与委员会或著名C++大师的人提出的被接受的建议? - Praxeolitic
@Praxeolitic,要想被接受,任何微小的变化都必须伴随着实现。 - SergeyA
1
@SergeyA 如果提案结构良好,并且具有具有说服力的动机部分和恰当措辞,那么这显然是错误的。现有的实现在一定程度上提高了接受变更的可能性,但并不是必要的(而且肯定不能补偿论文更重要的特点)。 - Columbo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接