>C++20 λ获得新功能(论文P0428R2.(,您可以像在正常函数中一样指定<typename T>
... 读那篇论文时,我注意到一个例子:
auto f = []<typenameT>(std::vector<T> vector) { /* ... */ };
这让我思考:
为什么语言不"弄清楚"T是一个类型(因为std::vector是一个模板,它期望类型参数在<>
内(。
auto f = [](std::vector<T> vector) { /* T deduced ... */ };
是否有技术限制阻止了这一点,或者用例太模糊/罕见而无法保证为其制定语言规则?
是否有技术限制阻止了这一点,或者用例是否太晦涩/罕见而无法保证为其制定语言规则?
是的,有一个技术限制阻止了这一点。该代码已经具有含义。
struct T { int i; };
auto f = [](std::vector<T> vector) { /* T not actually deduced */ };
模板与非模板有很大不同(有关彻底的处理,请参见P1392(。"简洁"语法的概念拼写concept auto x
而不仅仅是concept x
的原因之一是因为许多人强烈希望相同的语法不应该基于所使用的名称类型而意味着截然不同的东西。
这样的语言功能将导致相同的语法,这意味着基于是否找到名称而截然不同的东西 - 这似乎很难理解代码。更糟糕的是,这会导致作者的意图是这个lambda实际上是一个模板,然后某个时候它只是通过偶然添加名称而成为非模板,或者如果偶然引入的名称命名为变量(即int T;
(
概念 TS 对此有不同的语法,即:
auto f = [](std::vector<auto> vector) { /* deduced, but no name */ };
这个概念 TS 功能似乎很可能会在 C++23 中提出,因为它肯定会很有用,原因与我仍然会在许多地方编写[](auto x){}
而不是[]<class T>(T x){}
相同。