C ++ 11引入了对成员函数进行ref-qualify以及完美转发的能力。但我们可以将它们混合在一起吗?
考虑这个(工作)的例子:
struct bar{
std::string str;
void do_stuff() & {
/* version 1 */
}
void do_stuff() && {
/* version 2 */
}
};
struct foo{
bar data;
void do_stuff() & {
data.do_stuff();
}
void do_stuff() && {
std::move(data).do_stuff();
}
};
int main(){
foo f;
f.do_stuff() // calls version 1 of bar::do_stuff()
std::move(f).do_stuff() // calls version 2 of bar::do_stuff()
}
在main()
内,第一个呼叫呼叫版本1或bar::do_stuff()
,第二个呼叫呼叫版本2或bar::do_stuff()
。 foo::do_stuff()
中有一些代码重复。如果ref-qualifiers用于隐含*this
以外的参数,我们可以轻松地完成转发:
template <typename T>
void do_stuff (T&& t) {
std::forward<T>(t).do_stuff();
}
是否有完全转发*this
对象的等效方法?
注意:如果正确的解决方案仅存在于C ++ 14或C ++ 17中,我也很乐意知道。