为什么 && 有时绑定左值而有时不绑定?

Why does && sometimes bind lvalues and other times not?

好的,我有这个代码:

struct Mine{
    template<typename T>
    Mine(T&& x){
    }
};
void nFoo(int&& x){
}
void sFoo(Mine x){
}

nFoo 直接采用 int&&,而 sFoo 做了一些欺骗以获得相同的效果。

考虑这段代码:

nFoo(12); //Works

int x = 0;
nFoo(x);  //Cannot bind int (lvalue) to int&&

sFoo(12); //Works
sFoo(x);  //Works

为什么 int&& 有时允许来自 lvalue 的绑定有时不允许?

Why does the int&& sometimes allow binding from lvalues and sometimes not?

int&& 没有绑定到左值,因为它是一个 右值引用 .

T&&,在 T 是模板参数的上下文中,确实绑定到左值,因为它是 forwarding reference。它不是右值引用,尽管语法几乎相同。