gpt4 book ai didi

c++ - 可以指定 C++20 模板化 lambda 来推断嵌套在参数中的类型吗?

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:33 28 4
gpt4 key购买 nike

C++20 lambdas 获得了一个新特性(paper p0428r2.),你可以指定<typename T>和正常功能一样...阅读那篇论文我注意到一个例子:

auto f = []<typenameT>(std::vector<T> vector) { /* ... */ };

这让我开始思考:

为什么 langage 不能“弄清楚” T 是一个类型(因为 std::vector 是一个模板,它需要 <> 中的类型参数)。

auto f = [](std::vector<T> vector) { /* T deduced ... */ };

是否存在阻止这种情况的技术限制,或者用例是否过于晦涩/罕见以致无法为其制定语言规则?

最佳答案

Is there a technical limitation preventing this, or is the use case too obscure/rare to warrant a language rule for it?

是的,有一个技术限制阻止了这个。该代码已经有意义

struct T { int i; };
auto f = [](std::vector<T> vector) { /* T not actually deduced */ };

模板与非模板非常不同(详见 P1392)。概念“简洁”语法拼写的原因之一 concept auto x而不仅仅是 concept x是因为许多人强烈希望相同的语法不应该根据所用名称的种类而表示截然不同的东西。

这样的语言特性会导致相同的语法根据是否找到完全不同的名称来表示完全不同的东西——这似乎很难理解代码。更糟糕的是,它会导致这样的情况,即作者的意图是这个 lambda 实际上是一个模板,然后过了一段时间它只是通过偶然添加一个名称变成了一个非模板,或者如果名称顺便引入了一个命名变量(即 int T; )


Concepts TS 对此有不同的语法,即:

auto f = [](std::vector<auto> vector) { /* deduced, but no name */ };

这个 Concepts TS 功能似乎很可能会被提议用于 C++23,因为它肯定会很有用,原因与我仍然会写 [](auto x){} 的原因相同。在许多地方而不是 []<class T>(T x){} .

关于c++ - 可以指定 C++20 模板化 lambda 来推断嵌套在参数中的类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58291914/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com