0

我有一个使用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>返回假。 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

右值引用被激活,我在一个示例程序中检查了它,我在 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();
}
4

0 回答 0