【问题标题】:Compiler crashes on generic lambda编译器在通用 lambda 上崩溃
【发布时间】:2016-08-27 22:29:20
【问题描述】:

我在代码(Qt5 项目)中启用了 C++14,类似于以下内容:

auto func = [&](auto p, auto pp) {
    if(!p)
        return;
    pp = p;
    p->init();
    this->member_function(pp->thing()); // replaces member_function(pp->thing());
};
MyClass *p1;
...
func(p1, m_p);
m_p->doSomething();

收到后:

internal compiler error: Segmentation fault

调试我发现m_p在调用func 后没有改变,正如我所期望的那样。通用 lambda (auto) 真的如此有效吗?如何在上面的代码中更改m_p

【问题讨论】:

  • 我在解析标题和语言功能问题时遇到问题。 “通用模板”是否有另一个名称?或者这是自动类型变量、返回类型推导或 Lambda 的问题?另见C++ Standards Support in GCC
  • 有时编译错误会触发编译器错误。也许您代码的其他部分(例如 doSomething())会产生编译错误,进而暴露编译器中的错误。尝试其他编译器或找出代码中的问题(无需编译器的帮助)。首先删除 lambda 中的捕获 &,因为它不是必需的。
  • 显示m_p的声明。
  • @Oktalist m_p 是一个类成员指针,指向正在加载的插件。
  • @alfC capture & 是必需的,因为调用了类成员函数this->member_function(pp->thing());。我发现有与此相关的 gcc 错误,不使用 this-> 会暴露它(gcc.gnu.org/bugzilla/show_bug.cgi?id=61636)。

标签: c++ qt c++11 qt5 c++14


【解决方案1】:

在 gcc 的 bugzilla 中提交错误报告。无论您的代码是否是有效的 C++,编译器都不应因分段错误而崩溃。

【讨论】:

  • 我可以要求你更详细一点吗?
  • 您完全可以要求我更详细一些。但是也没什么好说的了:恭喜,你在 gcc 中发现了一个 bug。作为奖励,您将在 gcc 的 bugzilla 中获得完全免费的错误报告!
  • 是什么让你认为 OP 正在使用 GCC?
  • 初级。您不会在 Windowsware 上遇到“分段错误”。通过排除的过程,剩下的可能性已经不多了。
  • 嗯,它适用于clang。实际上,在 Windows MinGW 上收到internal compiler error: Segmentation fault 后,我正在使用 Debian Jessie 尝试 gcc 和 clang。
【解决方案2】:

编译器中的分段错误非常糟糕,但是您是否尝试过使用auto& pp?看起来 m_p 是按值而不是引用传递的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多