C ++ for_each()lamda函数不正确

时间:2018-11-29 19:10:26

标签: c++

谁能告诉我为什么for_each()在下面的代码中不起作用。

我需要它检查元组中的第三个元素是否不是nullptr,如果不是,则将第一和第三个元素添加到list

但是,似乎所有元素都添加到了list中。

std::vector<std::tuple<std::string, std::type_index, Value>> arguments;


 std::vector<std::pair<std::string, mv::Value>> class::defaultValues() const
{
    std::vector<std::pair<std::string, Value>> list;
    list.reserve((arguments.size()));

    std::for_each(arguments.begin(), arguments.end(),[&list](std::tuple<std::string, std::type_index, Value> arg)
        {
            if (&std::get<2>(arg) != nullptr)
                list.push_back(make_pair(std::get<0>(arg),std::get<2>(arg)));
        }
    );
    return list;
}

更新:

Value是一门课。

默认构造函数是什么,它将ptr_填充为nullptr

Value() : ptr_(nullptr)
        {

        }

2 个答案:

答案 0 :(得分:2)

&std::get<2>(arg)返回Value对象本身的内存地址,而不是其保存的ptr_ < sup> 1 。该地址永远不会为空。

1:除非Value覆盖operator&以返回ptr_,否则不应这样做!

您需要删除&,以便比较实际的Value对象。但这仅在Value已实现operator==接受T*(其中Tptr_类型)或{{ 1}}作为输入,并将其与nullptr_t进行比较。否则,您的lambda必须直接访问和比较ptr_

您还应该通过引用而不是通过值传递lambda的ptr_参数,以便对存储在arg中的原始tuple而不是对复制。

尝试一下:

arguments

在这种情况下,我建议改为使std::for_each(arguments.begin(), arguments.end(), [&list](std::tuple<std::string, std::type_index, Value> &arg) { if (std::get<2>(arg) != nullptr) // or std::get<2>(arg).ptr_, depending on how Value is implemented list.push_back(std::make_pair(std::get<0>(arg), std::get<2>(arg))); } 实现Value(如果尚未实现)以返回其operator!是否为ptr_,那么您可以这个:

nullptr

或者,实现std::for_each(arguments.begin(), arguments.end(), [&list](std::tuple<std::string, std::type_index, Value> &arg) { if (!!std::get<2>(arg)) list.push_back(std::make_pair(std::get<0>(arg), std::get<2>(arg))); } 返回operator bool是否不是ptr_,或者实现nullptr返回operator T*(其中ptr_T的类型),则可以执行以下操作:

ptr_

答案 1 :(得分:0)

因为&std::get<2>(arg)永远不会是nullptr。实际上,您正在获得指向&返回的某些Value &的指针(带有std::get<2>(arg))。