想象以下情況:
class C {
public:
C(std::vector<int> data): data(data) {}
C sub_structure(std::vector<size_t> indices){
std::vector<int> result;
for(auto i : indices)
result.push_back(data[i]); // ***
return C(result);
}
std::vector<int> data;
};
C f(){
...
}
...
C c = f().sub_structure(...);
我猜在標記的行***中,制作了元素的副本data,盡管sub_structure在即將被銷毀的物件上呼叫。
如果我的呼叫類似于,我可以通過右值參考sub_structure(f(), ...)多載;sub_structure但是,作為一個類方法,我不知道如何做到這一點,基本上基于 if*this是一個右值參考。
如果不求助于全域函式,這種行為是否可能?
uj5u.com熱心網友回復:
如果我的呼叫類似于 sub_structure(f(), ...),我可以通過右值參考多載 sub_structure;但是,作為一個類方法,我不知道如何做到這一點,基本上基于 if *this is a rvalue reference。
你的意思是超載價值類別?不知道這是否是你的意思,但如果你的問題正確,我會這樣:
struct S
{
std::vector<int> data;
S doStuff() &&
{
std::cout << "rvalue\n";
return {std::move(data)};
}
S doStuff() const&
{
std::cout << "const lvalue\n";
return {data};
}
};
演示https://godbolt.org/z/5c89edMKv
這絕不是詳盡無遺的,人們可以很容易地回傳例如在 const& 多載上對 const *this 的參考,在非 const 上復制等。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/472149.html
