返回的迭代器的值错误

时间:2018-11-25 18:53:54

标签: c++ std

我只是试图围绕一些我经常使用的标准算法函数创建包装函数,例如findfind_if等。

但是由于某些原因,当我使用包装函数时,返回的迭代器具有错误的值。

此代码失败:

template<typename Container, typename ElementType>
typename Container::const_iterator
find(Container c, const ElementType& e)
{
    return std::find(std::begin(c), std::end(c), e);
}

template <typename T, typename Container>
bool
within_container(const T& element, const Container& v)
{
    return find(v, element) != v.end();
}

int
main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    int key = 10;
    bool res  = within_container(key, v);
    assert(res == false);
}

这段代码可以正常运行:

template <typename T, typename Container>
bool
within_container(const T& element, const Container& v)
{
    return std::find(std::begin(v), std::end(v), element) != v.end();
}

int
main()
{
    std::vector<int> v = {1, 2, 3, 4, 5};
    int key = 10;
    bool res  = within_container(key, v);
    assert(res == false);
}

我想念什么?

我正在ubuntu 18.04上使用g ++ 7.3进行编译。

1 个答案:

答案 0 :(得分:1)

find函数模板按值获取c并将迭代器返回到对象,该对象在函数返回时销毁,从而导致调用者中行为未定义。

可以通过使用Container&& c(转发参考)作为参数来解决此问题。