簡體   English   中英

用元組函子轉換的boost :: transformed發出奇怪的警告

[英]boost::transformed with tuple functor gives strange warning

我為元組std :: get寫了一個方便的仿函數包裝器。 將其與boost transform和operator []結合使用時,出現警告,我正在返回對本地臨時對象的引用 我的系統: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關鍵字擺脫了警告,但我不知道為什么,也不想假設functor僅獲得非const范圍。

問題:如何修復代碼以擺脫警告? 為什么刪除const會擺脫警告?

這是真的。

//
// 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 (僅當元素是abstract,array或function時才是引用,否則為value_type)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM