gpt4 book ai didi

c++11 - C++1y 返回类型推断

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

具有某种 Hindley-Milner 类型推断变体的编程语言可以轻松推断表达式的类型,例如

let rec fix f x = f (fix f) x 

而 C++1y 中的返回类型推断在以下情况下失败:
int main() {
auto fix =
[&](auto f) {
return [&](auto x) {
return f(fix(f))(x);
};
};
return 0;
}

我用clang 3.5和命令试过这个
clang++ -std=c++1y fix.cc

我得到
fix.cc:7:18: error: variable 'fix' declared with 'auto' type cannot appear in its
own initializer
return f(fix(f))(x);

C++ 的返回类型推断中缺少什么,当必须推断返回类型时,不允许在它自己的初始值设定项中使用变量?我可以做些什么来解决这个问题,更好的是,我们可以做些什么来解决这个问题?

最佳答案

这里的问题不是类型推断的问题。直接的问题很简单,即使这样做是完全合理且可实现的,也不存在 lambda 引用自身的语法。可以轻松定义引用自身的函数对象。

您的特定 lambda 有一个问题,即您通过引用捕获本地对象,然后允许该引用转义其有效范围,但如果我们将其更改为:

int main() {
auto fix =
[](auto &f) {
return [&](auto x) {
return f(fix(f))(x);
};
};
return 0;
}

然后我们可以编写和使用等效的函数对象:
#include <iostream>

struct lambda1 {
template<typename F>
auto operator() (F &f) const;
};

template<typename F>
struct lambda2 {
lambda1 const &l1;
F &f;
lambda2(lambda1 const &l1, F &f) : l1(l1), f(f) {}

template<typename X>
auto operator() (X x) const { return f( l1(f))(x); }
};

template<typename F>
auto lambda1::operator() (F &f) const {
return lambda2<F>(*this, f);
} // ^
// |
// --- there's no syntax to do this inside a lambda.

int main() {
lambda1 fix;
auto f = [](auto&&){ return [](int x) {return x;}; };
std::cout << fix(f)(5) << '\n';
}

如果添加某种语法以允许 lambda 引用自身,那么这会很好。

关于c++11 - C++1y 返回类型推断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21634889/

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