基本上我想从常量左值版本和右值引用的版本提供施工:如何处理const T&和T &&实例化相同的签名?
transform_iterator(const Functor& f, const Iterator& it) :
functor(f),
iterator(it)
{}
transform_iterator(Functor&& f, Iterator&& it) :
functor(f),
iterator(it)
{}
据我所知,右值引用的版本不具有普遍性引用。尽管如此,在该调用位置:
template <typename InputIt, typename OutputIt>
std::pair<InputIt, OutputIt> sliding_average(InputIt first, InputIt last,
const typename std::iterator_traits<InputIt>::difference_type window_length,
OutputIt d_first)
{
using value_type = typename std::iterator_traits<InputIt>::value_type;
auto divide = [&window_length](const value_type& value)
{
return value/window_length;
};
auto iterator = shino::transformer(divide, d_first); //transform_iterator<Functor, Iterator>
shino::sliding_window(first, last, iterator, window_length);
//^^ pass by value
编译器说,右值引用的版本最终被const的左值参考版本。
为了完整起见,这里的sliding_average
sliding_average(v.begin(), v.end(), window_length, output.begin());
其中两个v
和output
是int和double型向量调用点,并window_length
是std::size_t
。
当我删除常量左值版本,代码编译和工作正常。
而且,这个代码没有问题编译与两个构造函数:
std::vector<std::string> v{"23", "25", "27"}; //just random numbers
std::vector<int> output(v.size());
auto string_to_int = [](const std::string& x)
{
return std::stoi(x);
};
auto conversion_iterator = shino::transformer(string_to_int, output.begin());
问题:如何解决?
凡'transform_iterator'被称为有*右值*? –
@VittorioRomeo,已更新。 – Incomputable
你还没有通过* rvalue *。 'iterator'是* lvalue *,就像'd_first'一样。你忘了'std :: move'吗? –