繁体   English   中英

为什么C ++ 20模板lambda使用typename关键字?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM