移动 `this` 的语义?
move semantics for `this`?
想象一下以下情况:
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
;但是,作为 class 方法,我不知道该怎么做,主要是基于 if *this
是否是右值引用。
如果不求助于全局函数,这种行为是否可能?
If my call was something like sub_structure(f(), ...), I could overload sub_structure by rvalue reference; however, as a class method, I'm not aware how to do that, basically based on if *this is an 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
这绝不是详尽无遗的,可以很容易地 return 例如在 const& 重载上引用 const *this,在 non-const 上复制等
想象一下以下情况:
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
;但是,作为 class 方法,我不知道该怎么做,主要是基于 if *this
是否是右值引用。
如果不求助于全局函数,这种行为是否可能?
If my call was something like sub_structure(f(), ...), I could overload sub_structure by rvalue reference; however, as a class method, I'm not aware how to do that, basically based on if *this is an 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
这绝不是详尽无遗的,可以很容易地 return 例如在 const& 重载上引用 const *this,在 non-const 上复制等