gpt4 book ai didi

c++ - 为什么要设计一种具有独特匿名类型的语言?

转载 作者:行者123 更新时间:2023-12-01 08:20:26 25 4
gpt4 key购买 nike

作为 C++ lambda 表达式的一个特性,这一直困扰着我:C++ lambda 表达式的类型是唯一且匿名的,我根本无法将其写下来。即使我创建了两个语法完全相同的 lambda,结果类型也被定义为不同的。结果是,a) lambdas 只能传递给模板函数,允许编译时,不可描述的类型与对象一起传递,b) lambdas 只有在通过 std::function<> 类型删除后才有用.
好的,但这只是 C++ 的方式,我准备将它写为该语言的一个令人讨厌的功能。然而,我刚刚了解到 Rust 似乎也做同样的事情:每个 Rust 函数或 lambda 都有一个唯一的匿名类型。现在我想知道:为什么?
所以,我的问题是:
从语言设计者的角度来看,将独特的匿名类型的概念引入语言有什么好处?

最佳答案

许多标准(尤其是 C++)采取的方法是尽量减少对编译器的要求。坦白说,他们的要求已经够多了!如果他们不必指定某些东西来使其工作,他们倾向于将它的实现定义。
如果 lambda 不是匿名的,我们就必须定义它们。这将不得不说很多关于如何捕获变量。考虑 lambda [=](){...} 的情况.该类型必须指定 lambda 实际捕获了哪些类型,这可能很难确定。另外,如果编译器成功优化了一个变量呢?考虑:

static const int i = 5;
auto f = [i]() { return i; }
优化编译器可以很容易地识别出 i 的唯一可能值。可以捕获的是 5,并将其替换为 auto f = []() { return 5; } .但是,如果类型不是匿名的,这可能会更改类型或强制编译器优化较少,存储 i即使它实际上并不需要它。这是一整套复杂性和细微差别,对于 lambda 的意图来说根本不需要。
而且,在您确实需要非匿名类型的情况下,您始终可以自己构造闭包类,并使用仿函数而不是 lambda 函数。因此,他们可以让 lambda 处理 99% 的情况,而让您在 1% 的情况下编写自己的解决方案。

Deduplicator 在评论中指出,我没有像匿名那样解决唯一性问题。我不太确定唯一性的好处,但值得注意的是,如果类型是唯一的( Action 将被实例化两次),以下行为是明确的。
int counter()
{
static int count = 0;
return count++;
}

template <typename FuncT>
void action(const FuncT& func)
{
static int ct = counter();
func(ct);
}

...
for (int i = 0; i < 5; i++)
action([](int j) { std::cout << j << std::endl; });

for (int i = 0; i < 5; i++)
action([](int j) { std::cout << j << std::endl; });
如果类型不是唯一的,我们将必须指定在这种情况下应该发生什么行为。那可能很棘手。在这种情况下,关于匿名性主题的一些问题也引起了他们对独特性的丑陋头脑。

关于c++ - 为什么要设计一种具有独特匿名类型的语言?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63172736/

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