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工作?这不是打败右值引用的对象吗?
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到左值参考.
| 归档时间: |
|
| 查看次数: |
98 次 |
| 最近记录: |