我很难实现以下代码

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不是右值。为了使代码编译,我不得不将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

最佳答案

return getVector(); // not compile

这等效于:
return this->getVector(); // not compile

由于this是左值而不是右值,因此无法编译,并且只能在rvalue上调用getVector(),因此不会编译。

请注意,this始终是左值-即使在rvalue-ref成员函数内部!
return std::move(*this).getVector();

那是调用getVector()的正确方法。

关于c++ - 用ref限定符实现方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23490185/

10-11 19:06