Я просто пытаюсь создать функции-оболочки для некоторых функций стандартного алгоритма, которые я часто использую, например 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);
}

Что мне не хватает?

Я компилирую с g ++ 7.3 на ubuntu 18.04.

1
Adham Zahran 25 Ноя 2018 в 21:53

1 ответ

Лучший ответ

Этот шаблон функции find принимает c по значению и возвращает итераторы к объекту, который уничтожается при возврате функции, что приводит к неопределенному поведению вызывающего объекта.

Это можно исправить, используя Container&& c (ссылку пересылки) в качестве параметра.

1
M.M 25 Ноя 2018 в 21:47