Подтвердить что ты не робот

Реализовать метод с рефлектором

Мне трудно реализовать следующий код

template <class T>
struct Foo
{
    std::vector<T> vec;

    std::vector<T> getVector() && {
        // fill vector if empty
        // and some other work
        return std::move(vec);
    }

    std::vector<T> getVectorAndMore() &&
    {
        // do some more work
        //return getVector(); // not compile
        return std::move(*this).getVector(); // seems wrong to me
    }
};

int main()
{
    Foo<int> foo;

    auto vec = std::move(foo).getVectorAndMore();
}

Проблема заключается в том, что я не могу вызвать getVector внутри getVectorAndMore, потому что this не является rvalue. Чтобы скомпилировать код, мне пришлось отбрасывать this в rvalue.

Есть ли хороший способ реализовать такой код?


с return getVector();

сообщение об ошибке

main.cpp:17:16: error: cannot initialize object parameter of type 'Foo<int>' with an expression of type 'Foo<int>'
        return getVector(); // not compile
               ^~~~~~~~~
main.cpp:26:31: note: in instantiation of member function 'Foo<int>::getVectorAndMore' requested here
    auto vec = std::move(foo).getVectorAndMore();
                              ^
1 error generated.

Coliru

4b9b3361

Ответ 1

return getVector(); // not compile

Это эквивалентно этому:

return this->getVector(); // not compile

который не будет компилироваться, поскольку this является значением lvalue, а не rvalue и getVector() может быть вызван только на rvalue, следовательно, ошибка.

Обратите внимание, что this всегда является lvalue — даже внутри функции rvalue-ref!


return std::move(*this).getVector();

Это правильный способ вызвать getVector().