1

我理解一致性参数,但是模板的大多数参数都是类型,所以我觉得由于 lambdas 是定义结构的简洁方式,它可能应该默认为typename/ class(你仍然需要编写int/size_t/short)。

如果有人不熟悉 C++20 中对 lambdas 的更改,这里是示例:

[]<typename T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};

我的问题是为什么不:

[]<T>(const std::vector<T>& v)
{
    for(const auto& x : v) { std::cout << x; }
};
4

3 回答 3

7

问题是这已经有意义了:

template <T> void foo();

它是一个带有一个模板参数的函数模板,该模板参数是一个类型为 的非类型模板参数T,并且该模板参数没有名称。

如果相同的语法意味着非常不同的东西,这取决于你是引入一个函数模板还是一个通用的 lambda,那将是非常令人困惑的——也就是说,两个非常相似的上下文服务于相似的目的!

另外......如果你真的想要一个非类型模板参数,你会怎么做?就是不能有吗?

于 2019-06-09T17:29:56.483 回答
3

虽然简洁确实是 lambda 的一个卖点,但它并不足以取代对一致性的需求。对于涉及模板的功能尤其如此,因为它们比非模板语言功能更难掌握。

特别是,通用 lambdas 的模板语法首先具有狭窄的范围,即大多数 lambdas 可以没有它(事实上,您给出的示例是一个完美的示例,即不使用它,因为函数体没有实例化一个T或做一些类似的事情)。来自P0428(重点是我的):

作者认为当前定义泛型 lambda 的语法不够充分有几个关键原因。它的要点是,可以使用普通函数模板轻松完成的某些事情需要使用通用 lambda 来完成大量的环跳,或者根本无法完成。

在其主体中使用的通用 lambdadecltype可能是新功能最突出的客户。就额外的打字和简洁性而言,用我替换decltype/ decay_t-trickery<typename T>似乎更容易接受。

于 2019-06-07T10:03:36.970 回答
2

如果你只是写

[]<T>(){ }

什么是T

一个typename?一个auto价值?

在我看来,在 lambda 和常用函数中,有必要明确什么是模板参数。

如果您可以T从使用中推断出这是一个类型(如果它被用作std::vector必须是类型的第一个模板参数),为什么只简化 lambda 语法而不简化传统模板函数的语法?

于 2019-06-07T09:58:38.487 回答