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