我有一个程序正在使用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();
}