为什么 C++20 模板 lambda 使用类型名关键字?
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,那将是相当令人困惑的——也就是说,两个非常相似的上下文服务于类似的目的!
再加上...如果您实际上想要一个非类型模板参数,您会怎么做?只是不能有一个?
虽然简洁确实是lambdas的一个卖点,但它还不够重要,不足以取代对一致性的需求。对于涉及模板的功能尤其如此,因为它们比非模板语言功能更难掌握。
特别是,通用 lambda 的模板语法首先具有狭窄的范围,即大多数 lambda 都可以没有它(事实上,你给出的例子是一个不使用它的完美例子,因为函数体不会实例化T
或做一些类似的事情)。从P0428(强调我的):
作者认为当前定义通用 lambda 的语法不足有几个关键原因。它的要点是,一些可以用普通函数模板轻松完成的事情需要使用通用 lambda 完成大量的箍跳,或者根本无法完成。
体内使用量decltype
的通用 lambda 可能是新功能最突出的客户。就额外的打字和简洁性而言,用<typename T>
替换decltype
/decay_t
诡计对我来说似乎更容易接受。
如果你只是写
[]<T>(){ }
什么是T
?
typename
?auto
值?
在我看来,在 lambda 中和在常见函数中一样,有必要明确什么是模板参数。
如果你能从使用中推断出T
是一种类型(如果它被用作std::vector
必须是类型的第一个模板参数),为什么只简化lambda语法而不是传统模板函数的语法?
- 使用 'typename' 关键字将非类型视为依赖上下文中的类型
- 为什么在VS2015中模板相关的嵌套类型名称中不需要typename关键字?
- 使用 (c++11) 声明类型时放置 __declspec(dllimport) 关键字的位置
- C 有一个关键字,允许从派生类引用基本类型
- 在 Objective-C++ 中应用于__weak指针时,通过关键字推导类型"auto"规则是什么?
- 为什么类型关键字以"_t"后缀结尾?
- 为什么 C++20 模板 lambda 使用类型名关键字?
- 是否可以将“自动”关键字用作函数指针声明中使用初始化的返回类型
- 我可以在动态知道其类型的模板类对象中使用 auto 关键字吗?我不能在没有初始值设定项的情况下使用 auto 关键字吗?
- 使用两种或两种以上数据类型的对象作为c++映射、OOP的关键字
- 兰巴类型不是通过模板化函数或自动关键字推断的
- c++11 中的关键字类型
- 函数返回类型和名称之间存在未知关键字
- 返回类型后的静态关键字
- 关键字自动默认为哪种类型
- STD ::对行为的对模板类型扣除?(否,显式关键字错误)
- 作为返回类型的枚举关键字的存在表明什么
- 返回类型 - C++ "class"关键字
- 是否可以更改'this'关键字的类型?
- 在派生类中使用关键字来区分类型