【问题标题】:boost::transformed with tuple functor gives strange warningboost::transformed with tuple functor 给出了奇怪的警告
【发布时间】:2015-01-14 08:20:53
【问题描述】:

我为元组 std::get 编写了一个方便的函子包装器。将它与 boost 转换和 operator[] 一起使用时,我收到警告说我正在返回对本地临时对象的引用。我的系统:ubuntu 14.04,编译器:clang-3.5 和 g++-4.8.2,boost 版本: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 范围。

问题:如何修复代码以消除警告?为什么删除 const 会摆脱警告?

【问题讨论】:

  • 适用于 boost 1.55 和 g++-4.8.2。
  • @ForEveR 我也注意到了这一点。我专门下载了 boost 1.56 来重新测试:)

标签: c++ boost g++ clang++ boost-range


【解决方案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)。

【讨论】:

  • 呸,你打败了我。
  • @sehe 所以使用operator[]是个bug?为什么没有 const 就没有警告?
  • 是的。我觉得这很难解释。然而,这是本标准提案中描述的内容:open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4221.pdf 参见例如§2.3 普遍观察下的样本,与这个非常相似。
猜你喜欢
  • 2021-08-27
  • 1970-01-01
  • 2012-03-04
  • 2011-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-29
  • 1970-01-01
相关资源
最近更新 更多