模板允许左值与右值参考绑定

Adr*_*May 3 c++ rvalue-reference move-semantics c++11

这个程序:

using namespace std;
#include <iostream>
#include <memory>

struct Dog 
{ 
    int legs; 
} adog;

Dog gimmeadog() { return adog; }

void walk(Dog && d) { cout << "Nonconst right dog walk\n"; }

//template<class T> void walk(T && d) { d.legs=3; cout << "Nonconst right something walk\n"; }

int main() {
    Dog mydog = gimmeadog();
    walk(mydog);    
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

正确无法在gcc上编译,因为:

error: cannot bind rvalue reference of type ‘Dog&&’ to lvalue of type ‘Dog’
  walk(mydog);
Run Code Online (Sandbox Code Playgroud)

但是如果你取消对模板的评论,它就会很快地绑定并打印出"Nonconst right something walk".

为什么?什么类型的T工作?这不是打败右值引用的对象吗?

Max*_*kin 9

何时T是模板参数T&&转发引用,而不是r值.T得出Tr值和T&l值的推论.这样的参考与任何事物都有关系.


raf*_*x07 5

template<class T> 
void walk(T && d)
Run Code Online (Sandbox Code Playgroud)

在这种情况下T &&是转发引用,当你传递Lvalue(mydog对象)T被推断为T&,所以签名walk看起来像

void walk(Dog& );
Run Code Online (Sandbox Code Playgroud)

然后你可以绑定mydog到左值参考.

  • 请注意,该术语现在是转发引用而不是通用引用.它的名字来源于你通常"转发"那些参数. (5认同)