在我看来,能够将r值引用转换为l值引用使得最终能够以临时值的形式访问临时值是没有意义的。例如:从r值ref转换为l值ref,为什么它有效?
struct S
{
int val=5;
};
void foo(S &&s)
{
S &s2=s;
s2.val=7
}
void foo2(S &s2)
{
s2.val=7
}
int main()
{
foo(S()); // This is fine
foo2(S()); // Error: Even though this is logically equivalent to foo()
}
到foo()
呼叫似乎是有效的在C++或至少它用gcc 4.7.1编译。对foo2()
的呼叫不是,即使这两个功能似乎在逻辑上相同。是什么赋予了?
你没有转换任何东西。你将表达式's'的值绑定到引用变量's2'。没有错。 –
[阅读所有关于它](http://stackoverflow.com/a/5591006/2089675) – smac89
你可以直接在'foo()'内执行's.val = 7'。所以'&'和'&&'没有真正的区别,它们都可以以相同的方式使用。事实上,(设计上)很难说出它们之间的区别。最重要的区别是,当&&'是一个函数参数类型的一部分时,它允许它绑定(作为参考)临时。 –