我只是试图围绕一些我经常使用的标准算法函数创建包装函数,例如find
和find_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进行编译。
答案 0 :(得分:1)
此find
函数模板按值获取c
并将迭代器返回到对象,该对象在函数返回时销毁,从而导致调用者中行为未定义。
可以通过使用Container&& c
(转发参考)作为参数来解决此问题。