lambda/function 指针与 std::function 导致错误

lambda/function pointer with std::function causes error

更新:

这些错误似乎来自 Eclipse 的代码分析器 CODAN,它们出现在“问题”视图中,并且还在错误所指的行上用红色下划线标出。奇怪的是,构建项目成功创建了可执行文件,并且构建不会在控制台中报告这些错误。我可以 运行 该可执行文件并获得预期的输出。

所以现在问题变成了:如何让 Eclipse 的 CODAN 识别这些使用 std::function 的 lambda 和函数指针不是错误?

原问题:

在下面的 C++ 代码中,它直接用 g++ 编译很好,但在 Eclipse 中会导致错误 CDT。我怎样才能让我的 Eclipse 项目识别并允许将 lambdas(或函数指针)与 std::function 一起使用?

注意:请参阅问题底部的编辑以获取更新

#include <functional>
#include <iostream>

void foo(int i) {
    std::cout << i << std::endl;
}

void function_ptr(void (*bar)(int)) {
    bar(1);
}

void function_std(std::function<void(int)> baz) {
    baz(2);
}

int main() {
    // these function calls are ok
    function_ptr(&foo);
    function_ptr([](int i) -> void {
        foo(i);
    });

    // these function calls cause errors
    function_std(&foo);
    function_std([](int i) -> void {
        foo(i);
    });

    // these assignments cause errors
    std::function<void(int)> f1 = foo;
    std::function<void(int)> f2 = [](int i) -> void {
        foo(i);
    };

    f1(3);
    f2(3);

    return 0;
}

在命令行上编译此代码按预期工作并产生以下输出:

$ g++ src/LambdaFunctionParameterExample.cpp -o example
$ ./example
1
1
2
2
3
3

但是在 Eclipse 中,接受 std::function 作为参数的函数调用会产生此错误:

Invalid arguments '
Candidates are:
void function_std(std::function<void (int)>)
'

并且 std::function 变量赋值产生了这个错误:

Invalid arguments '
Candidates are:
 function()
 function(std::nullptr_t)
 function(const std::function<void (int)> &)
 function(std::function<void (int)> &&)
 function(#10000)
'

我在项目 -> 属性 -> C/C++ 构建 -> GCC C++ 编译器 -> 方言中将语言标准设置为 ISO C++17 (-std=c++17)。 (我假设设置此 属性 是根据此 documentation 访问 <functional> header 所必需的。奇怪的是,指定(或不指定)语言级别不会影响以上错误。并且,直接使用 g++ 构建时不需要指定语言级别。)

我正在使用 macOS Catalina 10.15.5、来自自制软件的 gcc 10.2.0 和 Eclipse CDT 版本 2020-09 (4.17.0)。

此行为是 known bug 与 Eclipse CDT 版本 10.0 的行为。

更新:

此问题已通过升级到 Eclipse CDT 版本 10.1 得到解决:
https://download.eclipse.org/tools/cdt/builds/10.1/cdt-10.1.0-rc2/

修复步骤:

  1. Help中输入上面的URL-->Install New Software...-->Work with:并安装所有选项
  2. 重新启动 Eclipse。
  3. Select Project --> C/C++ Index --> Rebuild.