基本上,我想提供const左值版本和右值参考版本的构造:

    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


编译器说rvalue参考版本最终是const lvalue参考版本。

为了完整起见,这里是sliding_average的呼叫站点

sliding_average(v.begin(), v.end(), window_length, output.begin());


其中voutput都是int和double的向量,而window_lengthstd::size_t

当我删除const lvalue版本时,代码可以编译并正常工作。

同样,此代码在两个构造函数中都可以正常编译:

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::transform_iterator



auto iterator = shino::transformer(divide, d_first);
//                                         ^^^^^^^
//                                         lvalue




要调用右值引用重载,您需要一个右值! std::move可用于将d_first转换为右值引用-示例:

auto iterator = shino::transformer(divide, std::move(d_first));
//                                         ^^^^^^^^^^^^^^^^^^
//                                         rvalue




这同样适用于您在编辑中添加的代码:

shino::sliding_window(first, last, iterator, window_length);
//                                 ^^^^^^^^
//                                 lvalue


您可能想要:

shino::sliding_window(first, last, std::move(iterator), window_length);
//                                 ^^^^^^^^^^^^^^^^^^^
//                                 rvalue




相关问题:


"C++11 lvalue, rvalue and std::move()"
"What are rvalues, lvalues, xvalues, glvalues, and prvalues?"

09-06 19:33