是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
Could have C++20 templated lambdas be specified to deduce the type nested inside an argument?
>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){}
相同。
相关文章:
- 嵌套参数包扩展失败
- 嵌套定义与定义的参数 C++
- 如何避免嵌套模板中的模板参数重复
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 以嵌套类为参数的友元模板声明
- 是否可以指定 C++20 个模板化 lambda 来推断嵌套在参数中的类型?
- 通过具有嵌套类的工厂类获取多个变异类模板参数包
- 嵌套模板类的模板类模板模板参数的专业化
- 不能使用嵌套结构中的联合元素作为 scanf() 的参数来存储所需的值
- 修改嵌套 lambda 中捕获的参数:gcc 与 clang?
- 声明嵌套在模板参数中的类型的变量?
- 将参考类型作为嵌套模板结构中的模板参数作为模板参数不起作用
- 模板嵌套类模板类作为与完全专业函数的参数
- C++ 17 可以处理嵌套的可变参数模板吗?
- 带有可变参数的嵌套宏在GCC中编译,但在MSVC中不编译
- 在C++中使用模板类的嵌套类作为模板模板参数
- 如何使用variadic参数包的嵌套模板类
- 如何在variadic模板中采用嵌套参数包
- 传递具有依赖嵌套参数类型的模板模板参数时出错
- gcc segfault在编译嵌套参数包代码上