gpt4 book ai didi

c++ - 使用 ref 限定符实现方法

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:21:14 26 4
gpt4 key购买 nike

我无法实现以下代码

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();
}

问题是我无法在 getVectorAndMore 中调用 getVector 因为 this 不是右值。为了编译代码,我必须将 this 转换为右值。

有什么好的方法可以实现这样的代码吗?


使用 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 是左值,而不是右值,并且 getVector() 只能在右值上调用,因此会出现错误。

请注意,this 始终 是一个左值 — 即使在 rvalue-ref 成员函数内部也是如此!


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

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

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

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com