将 lambda 转换为 std::函数时出现问题

Trouble casting lambda to std::function

本文关键字:问题 函数 转换 std lambda      更新时间:2023-10-16

我在尝试创建API时遇到MiniGW问题。这在MSVC11(Visual Studio 2012 C++编译器(中工作正常。我的编译器(我相信(QMAKE_CXXFLAGS += -std=c++0x设置正确,毕竟我确实有 lambda 错误消息。

有关更多说明:

typedef std::function<bool(Item)> WHERE;//I was attempting to provide an explicit cast, 'auto' works fine in MSVS

Group where(WHERE func);//A simple "foreach boolean" search

使用上述>

Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};

结果在:

tst_groupstest.cpp:257:错误:请求从"GroupsTest::groups((::__lambda1"转换为非标量类型"Groups::WHERE {aka std::function}" Groups::WHERE = [](Item & x(-> bool{return x.has("NEW"(;};

我希望这是显而易见的,我只是找不到它。我计划通过这个项目来支持Linux和Mac,所以我希望早日解决这个问题。

这是我目前的解决方法,如果可能的话,我宁愿远离它(毕竟,我在设计 API 时考虑到 lambda 的原因是拥有简洁的代码块,这是显而易见的(。

本节编译(它不使用 lambda(

struct lambdaCueListstdFunc{
    bool operator()(Groups::Item x)
    {
        return x.has("NEW");
    }
};
/**
 * Selects all cues for a particular list
 * @brief getCueList
 * @param list
 * @return a vector of all the cues for this list sorted by number.
 */
std::vector<Groups::Item> CueService::getCueList(std::string list)
{
    std::function<bool(Groups::Item)> where = lambdaCueListstdFunc();
//    auto where = [&list] (Groups::Item & x) ->
//    {
//        return x.get(la::cues::List) == list;
//    };
    std::vector<Groups::Item> result = cues()->where(where).sort(la::cues::NUMBER);
    return result; 
}

您提供给std::function的函数签名与您尝试分配给它的 lambda 的函数签名不同。

typedef std::function<bool(Item)> WHERE; // <-- Takes argument by value
Groups::WHERE where = [](Item & x)-> bool{return x.has("NEW");};
//                           ^^^
// The lambda takes argument by reference

更改其中一个以匹配另一个,具体取决于是要按值传递还是按引用传递。

这对我来说是

出于不同的原因:通过 lambda args 传递的按值类型具有 std::unique_ptr 类型的成员,因此不可复制。

修复 1:将成员更改为 std::shared_ptr

修复 2:传递(常量(引用