在默认初始化器中使用lambda

Using lambda in default initializer gcc vs clang

本文关键字:lambda 默认 初始化      更新时间:2023-10-16
#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);
}

对于clang++ from trunk工作正常,但是对于g++ from trunk失败,出现错误消息(link):

错误:'this'未捕获此lambda函数

命名空间作用域中point_of_cone的定义对两者都适用。

稍微修改了[this] lambda捕获的定义,也可以在全局或局部范围内正常工作。

哪个编译器是正确的?

这是一个gcc bug。

int main() {
    struct A {
        int x, i = [&] { return x; }();
    } a{0};
}

这个失败了,但是如果我们…

  • 更改&this,或
  • 声明A具有命名空间作用域,

它的工作原理。但是,这两种方法都不应该对格式良好性有任何影响。

报道:# 78019 .