提升信号2,自定义组合器,为什么它会触发复制

时间:2017-08-02 10:24:54

标签: c++ boost rvalue-reference boost-signals2

我有一个程序正在使用boost::signals2。我需要返回一个不可复制的值。为了实现这一点,我尝试更改组合器模板参数。关于这一点的奇怪之处在于,在组合器中我得到了一个错误。

这有效:

struct Combiner {
    using result_type = NonCopyable;

   template <class Iter>
   NonCopyable operator()(Iter b, Iter e) {
         return NonCopyable(something);
   }
};

using SignalType = boost::signals2::signal<NonCopyable (), Combiner>;

但是此刻我试图在Combiner::operator()内取消引用迭代器,事情就搞砸了。

struct Combiner {
    using result_type = NonCopyable;

   template <class Iter>
   NonCopyable operator()(Iter b, Iter e) {
         return *b;
   }
};

std::is_const<Iter>返回false。 std::is_reference<decltype(*b)>正在返回true。

我无法弄清楚为什么我有错误,但我看到错误的重载在这里选择:

void assign_value(argument_type val) { get_impl() = val; }
#ifndef BOOST_OPTIONAL_DETAIL_NO_RVALUE_REFERENCES
void assign_value(rval_reference_type val) { get_impl() = static_cast<rval_reference_type>(val); }
#endif

Rvalue引用被激活,我在一个示例程序中检查它,我在gcc中使用c ++ 14标志。有什么想法吗?

编辑:完整的例子。

#include <memory>
#include <boost/signals2.hpp>


class NonCopyable {
    std::unique_ptr<int> _i;
public:
    explicit NonCopyable(int i) : _i(new int(i)) {}
}; 

struct Combiner {
        using result_type = NonCopyable;

       template <class Iter>
       NonCopyable operator(Iter b, Iter b) const {
             return std::move(*b);
       }
    };

using SignalType = boost::signals2::signal<NonCopyable(), Combiner>;

int main() {
   SignalType s;
   s.connect([] { return NonCopyable(3); });
   s();
}

0 个答案:

没有答案