我很难实现以下代码
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/