为什么 C++20 模板 lambda 使用类型名关键字?

Why are C++20 template lambdas using typename keyword?

本文关键字:类型 关键字 C++20 模板 lambda 为什么      更新时间:2023-10-16

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

如果有人不熟悉 C++20 中对 lambda 的更改,下面是以下示例:

[]<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; }
};

问题是这已经有了一个含义:

template <T> void foo();

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

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

再加上...如果您实际上想要一个非类型模板参数,您会怎么做?只是不能有一个?

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

特别是,通用 lambda 的模板语法首先具有狭窄的范围,即大多数 lambda 都可以没有它(事实上,你给出的例子是一个不使用它的完美例子,因为函数体不会实例化T或做一些类似的事情)。从P0428(强调我的):

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

体内使用量decltype的通用 lambda 可能是新功能最突出的客户。就额外的打字和简洁性而言,用<typename T>替换decltype/decay_t诡计对我来说似乎更容易接受。

如果你只是写

[]<T>(){ }

什么是T

typenameauto值?

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

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