[英]Why are C++20 template lambdas using typename keyword?
我理解一致性参数,但是模板的大多数参数都是类型,因此我认为,由于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,即两个具有相似用途的非常相似的上下文,那将非常令人困惑。
再加上...如果您实际上想要一个非类型的模板参数,您将怎么办? 只是不能拥有一个?
虽然简洁确实是lambda的卖点,但它不足以取代对一致性的需求。 对于涉及模板的功能尤其如此,因为与非模板语言功能相比,它们更难掌握。
特别是,通用lambda的模板语法首先具有狭窄的范围,即,大多数lambda可以在没有它的情况下生存(实际上,您给出的示例是不使用它的完美示例,因为函数体没有实例化一个T
或做类似的事情。 从P0428 (强调我的):
作者认为当前定义通用lambda的语法不足的几个关键原因。 其要点是,使用常规函数模板可以轻松完成的某些事情需要使用通用lambda来完成,或者根本无法完成。
体内使用decltype
通用lambda可能是新功能的最主要客户。 就附加的键入和简洁性而言,用<typename T>
代替decltype
/ decay_t
-trickery对于我来说似乎更可接受。
如果你只是写
[]<T>(){ }
什么是T
?
typename
? auto
值?
在我看来,在lambda中,就像在通用函数中一样,有必要明确说明什么是模板参数。
并且,如果可以从用途中推断出T
是类型(如果将其用作std::vector
第一个模板参数,则必须是类型),为什么只简化lambda语法,而不简化传统模板函数的语法?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.