成员函数调用的对象右值传播
Object rvalue propagation for member function calls
我有一个结构 F
和一个函数 foo
,它有不同的实现,无论 F
是否是临时的
struct F{
void foo() & { std::cout << "F::foo() &" << std::endl; }
void foo() && { std::cout << "F::foo() &&" << std::endl; }
};
另一个结构 A
有一个 F
的副本,并在其函数 bar
中调用 F::foo
。我想使用 F::foo()
的正确版本。因此实现是:
struct A{
void bar() & {
f.foo();
}
void bar() && {
std::move(f).foo();
}
F f;
};
我想知道我是否真的必须提供 A::bar()
的两个实现。难道没有一种聪明的方法可以使用 std::forward
来自动决定应该使用哪个 F::foo()
吗?
一次尝试:
struct B{
void bar() {
std::forward<F>(f).foo();
}
F f;
};
但是,这不起作用。它每次都调用 F::foo() &&
。
Complete example
不,目前没有可用的快捷方式,您需要坚持使用详细版本。但是看看p0847,“演绎this
”。但是,不确定该提案的状态。来自摘要:
We propose a new mechanism for specifying or deducing the value category of an instance of a class. In other words, a way to tell from within a member function whether the object it’s invoked on is an lvalue or an rvalue, and whether it is const or volatile.
您可以使用 non-member 函数模板:
struct B{
template<typename TB>
friend void bar(TB&& self) {
std::forward<TB>(self).f.foo();
}
F f;
};
根据其他函数参数,您可能希望限制 TB
的类型,以便 is_base_of_v<B, remove_const_t<remove_reference_t<TB>>>
.
我有一个结构 F
和一个函数 foo
,它有不同的实现,无论 F
是否是临时的
struct F{
void foo() & { std::cout << "F::foo() &" << std::endl; }
void foo() && { std::cout << "F::foo() &&" << std::endl; }
};
另一个结构 A
有一个 F
的副本,并在其函数 bar
中调用 F::foo
。我想使用 F::foo()
的正确版本。因此实现是:
struct A{
void bar() & {
f.foo();
}
void bar() && {
std::move(f).foo();
}
F f;
};
我想知道我是否真的必须提供 A::bar()
的两个实现。难道没有一种聪明的方法可以使用 std::forward
来自动决定应该使用哪个 F::foo()
吗?
一次尝试:
struct B{
void bar() {
std::forward<F>(f).foo();
}
F f;
};
但是,这不起作用。它每次都调用 F::foo() &&
。
Complete example
不,目前没有可用的快捷方式,您需要坚持使用详细版本。但是看看p0847,“演绎this
”。但是,不确定该提案的状态。来自摘要:
We propose a new mechanism for specifying or deducing the value category of an instance of a class. In other words, a way to tell from within a member function whether the object it’s invoked on is an lvalue or an rvalue, and whether it is const or volatile.
您可以使用 non-member 函数模板:
struct B{
template<typename TB>
friend void bar(TB&& self) {
std::forward<TB>(self).f.foo();
}
F f;
};
根据其他函数参数,您可能希望限制 TB
的类型,以便 is_base_of_v<B, remove_const_t<remove_reference_t<TB>>>
.