boost :: преобразуется с помощью функтора кортежей.

Я написал удобную оболочку функтора для кортежа std :: get. Когда я использую его с преобразованием наддува и оператором [], я получаю предупреждение, что возвращение ссылки на локальный временный объект. Моя система: Ubuntu 14.04, компиляторы: clang-3.5 и g ++ — 4.8.2, буст-версия: 1.56.

#include <boost/range/adaptor/transformed.hpp>

#include <utility>
#include <vector>

template <std::size_t I>
struct tuple_get {
template <typename Tuple>
auto operator()(Tuple &&tuple) const ->
decltype(std::get<I>(std::forward<Tuple>(tuple))) {
return std::get<I>(std::forward<Tuple>(tuple));
}
};

int main() {
//removing const gets rid of warning
const std::vector<std::tuple<int,int>> v = {std::make_tuple(0, 0)};
//gives warning
(v | boost::adaptors::transformed(tuple_get<0>{})) [0];
}

Предупреждение детали:

include/boost/range/iterator_range_core.hpp:390:16: warning: returning reference to local temporary object [-Wreturn-stack-address]
return this->m_Begin[at];
note: in instantiation of member function 'boost::iterator_range_detail::iterator_range_base<boost::transform_iterator<tuple_get<0>,
std::__1::__wrap_iter<const std::__1::tuple<int, int> *>, boost::use_default, boost::use_default>, boost::random_access_traversal_tag>::operator[]' requested here
(v | boost::adaptors::transformed(tuple_get<0>{})) [0];

Добавление флага -Wreturn-stack-address не является решением, так как это опасно в больших проектах.

Я заметил, что удаление ключевого слова const избавляет от предупреждения, но я не знаю почему и не хочу предполагать, что функтор получает только неконстантные диапазоны.

Вопросы: Как исправить код, чтобы избавиться от предупреждения? Почему удаление const избавляет от предупреждения?

1

Решение

Это так.

//
// When storing transform iterators, operator[]()
// fails because it returns by reference. Therefore
// operator()() is provided for these cases.
//

Таким образом, вы должны быть в состоянии исправить это с

(v | boost::adaptors::transformed(tuple_get<0>{})) (0);

который возвращает abstract_value_type (который является ссылкой только в том случае, если элементы являются абстрактными, массивом или функцией, в противном случае это значение типа value_type).

2

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector