|
1
69
程序格式不正确(叮当声是对的) [dcl.spec.auto]/9 :
基本上,内部lambda的返回类型的推导取决于它本身(这里命名的实体是call操作符),因此必须显式地提供一个返回类型。在这种特殊情况下,这是不可能的,因为您需要内部lambda的类型,但无法命名它。但是在其他一些情况下,像这样强制递归lambda是可行的。 即使没有这个,你也有一个 dangling reference . 让我再详细说明一下,在与更聪明的人(即T.C.)讨论之后,原始代码(略微缩减)和提议的新版本(同样缩减)之间有一个重要的区别:
这就是内心的表达
为了
y-combinator . 论文的实施:
你想要的是:
|
|
2
34
: 这个构造是否严格按照C++规范似乎有争议。主流观点似乎认为这是无效的。有关更深入的讨论,请参阅其他答案。这个答案的其余部分适用 如果 这个构造是有效的;下面经过调整的代码可以与MSVC++和gcc一起使用,OP发布了进一步修改的代码,也可以与clang一起使用。
这是未定义的行为,因为内部lambda捕获参数
相反,您可以将外部lambda更改为通过引用而不是通过值获取self,从而避免了一堆不必要的副本,同时也解决了问题:
这样做有效:
|
|
|
3
21
TL;DR;叮当声是正确的。 看起来标准中导致这种格式错误的部分是 [dcl.spec.auto]p9 :
如果我们看看这个提议 A Proposal to Add Y Combinator to the Standard Library 它提供了一个有效的解决方案:
它引用了一个 dicussion in which Richard Smith alludes to the error that clang is giving you :
Recursive lambdas
这就解释了为什么这是不可能的,并围绕
|
|
4
13
看来叮当声是对的。考虑一个简化的例子:
让我们像一个编译器(一点)一样来研究它:
|
|
|
5
9
嗯,你的代码不起作用。但事实上:
测试代码:
您的代码是UB和格式错误,不需要诊断。这很有趣,但两者都可以独立修复。
解决方法:
代码格式错误。要了解这一点,我们可以展开lambda:
这将实例化
你不能那样做。
|
|
6
7
完成后,很明显主要的问题只是悬而未决的引用,而不接受代码的编译器在lambda部门受到了一些挑战。
一个完全模板化的版本,反映了原始代码中的内部lambda捕获模板化类型项的方式:
我猜这是内部机制中的模板,正式的规则是被设计来禁止的。如果他们真的禁止原来的建筑。 |
|
AstralHex · 矩阵乘法代码工作不正常 1 年前 |
|
|
Fishie · 作为类成员的智能指针是否仍然自动释放?[关闭] 1 年前 |
|
|
Die4Toast · 递归调用成员箭头运算符-> 1 年前 |
|
|
Anka Hanım · 关于结构和动态数组地址的问题 1 年前 |