C++ 在默认初始值设定项gcc vs clang中使用lambda #包括 #包括 int main() { 锥的结构点 { 双x,y; 双z=[&]{使用std::sqrt;返回sqrt(x*x+y*y);}(); }; _锥p={3.0,4.0}的点_; 断言(p.z==5.0); }

C++ 在默认初始值设定项gcc vs clang中使用lambda #包括 #包括 int main() { 锥的结构点 { 双x,y; 双z=[&]{使用std::sqrt;返回sqrt(x*x+y*y);}(); }; _锥p={3.0,4.0}的点_; 断言(p.z==5.0); },c++,lambda,c++14,language-lawyer,member-initialization,C++,Lambda,C++14,Language Lawyer,Member Initialization,对于来自中继的clang++可以正常工作,但是对于来自中继的g++会失败,并显示错误消息(): 错误:此lambda函数未捕获“this” 命名空间范围中的圆锥体的点的定义对这两个方面都适用 使用[this]lambda capture稍微修改定义后,无论在全局范围还是局部范围内,都可以很好地进行捕获 哪个编译器是正确的?这是一个gcc错误 #include <cassert> #include <cmath> int main() { struct point

对于来自中继的
clang++
可以正常工作,但是对于来自中继的
g++
会失败,并显示错误消息():

错误:此lambda函数未捕获“this”

命名空间范围中的
圆锥体的
点的定义对这两个方面都适用

使用
[this]
lambda capture稍微修改定义后,无论在全局范围还是局部范围内,都可以很好地进行捕获

哪个编译器是正确的?

这是一个gcc错误

#include <cassert>
#include <cmath>

int main()
{
    struct point_of_cone
    {
        double x, y;
        double z = [&] { using std::sqrt; return sqrt(x * x + y * y); }();
    };
    point_of_cone p = {3.0, 4.0};
    assert(p.z == 5.0);
}
这是失败的,但如果我们

  • 更改为
    ,或
  • A
    声明为具有命名空间范围
它起作用了。但是,这两种方法都不应该对良好的形式产生任何影响


报告:。

在您的问题中发布该代码,please@Orient不,我指的是xaxxon的godbolt链接,他在那里设置了错误的标志。嗯,问题是应该
[&]
捕获
这个
。不确定是否有新的标准,但这里的答案表明没有:@Hayt“如果lambda捕获包含捕获默认值为&,则该lambda捕获的简单捕获中的任何标识符都不应在&之前。如果lambda捕获包含捕获默认值为=,则该lambda捕获的每个简单捕获应采用“&标识符”的形式或者[*]这个。[Note:表单[&,这个]是多余的,但它被接受为与ISOC++ 2014兼容。-结束注释]“我不完全理解整个部分,但是注释清楚地表明[& ]。捕获this@Orient你的问题应该有所有必要的代码来重现你的问题如果这是我最近几次碰到的同一个bug,那么另一个解决方法是明确地说
这个->
@Griwes你能用反正推断出这不是你碰到的bug吗?:-)
int main() {
    struct A {
        int x, i = [&] { return x; }();
    } a{0};
}