作者:00zhhl_513 | 来源:互联网 | 2022-12-02 18:43
这个程序:
using namespace std;
#include
#include
struct Dog
{
int legs;
} adog;
Dog gimmeadog() { return adog; }
void walk(Dog && d) { cout <<"Nonconst right dog walk\n"; }
//template void walk(T && d) { d.legs=3; cout <<"Nonconst right something walk\n"; }
int main() {
Dog mydog = gimmeadog();
walk(mydog);
return 0;
}
正确无法在gcc上编译,因为:
error: cannot bind rvalue reference of type ‘Dog&&’ to lvalue of type ‘Dog’
walk(mydog);
但是如果你取消对模板的评论,它就会很快地绑定并打印出"Nonconst right something walk".
为什么?什么类型的T
工作?这不是打败右值引用的对象吗?
1> Maxim Egorus..:
何时T
是模板参数T&&
是转发引用,而不是r值.T
得出T
r值和T&
l值的推论.这样的参考与任何事物都有关系.
2> rafix07..:
template
void walk(T && d)
在这种情况下T &&是转发引用,当你传递Lvalue(mydog
对象)T
被推断为T&
,所以签名walk
看起来像
void walk(Dog& );
然后你可以绑定mydog
到左值参考.
请注意,该术语现在是转发引用而不是通用引用.它的名字来源于你通常"转发"那些参数.