6 c++ c++11 value-categories stdmove
以下是代码段:
int i=0;
int&&k=std::move(i);
Run Code Online (Sandbox Code Playgroud)
在c ++入门中,此举是
template <typename T>
typename remove_reference<T>::type &&move(T&& t)
{return static_cast<typename remove_reference<T>::type&&>(t);}
Run Code Online (Sandbox Code Playgroud)
据我所知,这个std::move模板会扣除一个像这样的函数
int&& move(int& t){return static_cast<int&&>(t);}
Run Code Online (Sandbox Code Playgroud)
作为比较和阐述我的问题,请考虑这样的示例:
int test(int k){k=66;return k;}
int k;
int a=test(k);
Run Code Online (Sandbox Code Playgroud)
上面的代码将编译为:
int temp;//the temporary object
temp=k;
int a=temp;
Run Code Online (Sandbox Code Playgroud)
同样,我认为第一个代码片段将被编译为:
int&& temp=0;
int&& k=temp;//oop!temp is an lvalue!
Run Code Online (Sandbox Code Playgroud)
这似乎是错误的,因为它temp是一个左值,我有什么不对吗?
同样,我认为第一个代码片段将被编译为:
Run Code Online (Sandbox Code Playgroud)int&& temp=0; int&& k=temp;//oop!temp is an lvalue!
您可能会将类型与值类别混淆.
每个C++表达式(具有操作数,文字,变量名等的运算符)的特征在于两个独立的属性:类型和值类别.
int&&k=std::move(i);并且int&& k=temp;是不相同的.返回类型std::move是rvalue-reference,然后std::move返回的是rvalue(更准确地说是xvalue),它可以绑定到rvalue-reference.在另一方面temp是一个命名的变量然后它总是一个左值,而不管其类型是int,int&,int&&等等左值不能被绑定到右值参考.
关于左值的更多信息:
以下表达式是左值表达式:
- 变量的名称,......
以下表达式是xvalue表达式:
- 函数调用或重载的运算符表达式,其返回类型是对象的右值引用,例如
std::move(x);- ...
- 一个强制转换表达式,以引用对象类型的rvalue,例如
static_cast<char&&>(x);
| 归档时间: |
|
| 查看次数: |
392 次 |
| 最近记录: |