void overloaded (int&& x) {
cout << "[rvalue]";
}
template <class T>
void fn (T&& x) {
overloaded(x);
}
int main() {
fn(0);
return 0;
}
我遇到编译错误了。
cannot bind ‘
int
’ lvalue to ‘int&&
’overloaded(x);
我在这里感到困惑,x
作为右值引用传递给fn()
。但是为什么fn()
中的overload()
调用会抱怨x
是左值?
&&
的命名),它就不能在没有额外“努力”(std::move
/std::forward
)的情况下用作r-value。你是否更喜欢“一旦给对象命名,它就不再是r-value了”? - ShadowRangerx
总是一个左值,没有“除非”的情况。像std::forward<T>(x)
这样的代码是与x
不同的表达式。整个段落似乎在谈论实际对象是否具有左值或右值属性。 - M.M