首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于C++11中右值摘引和move语义的疑问

2012-09-20 
关于C++11中右值引用和move语义的疑问有如下函数:C/C++ codevectorint&& fun(){vectorint result//对

关于C++11中右值引用和move语义的疑问
有如下函数:

C/C++ code
vector<int>&& fun(){    vector<int> result;    //对result有插入等操作    return result;}

这样编译有错,因为result不是右值。
然后改成这样:
C/C++ code
vector<int>&& fun(){    vector<int> result;    //对result有插入等操作    return move(result);}


这样编译没有问题,但在运行时,还是会有错。
我用的是VS2012 。难道只能返回在return语句里构造的对象?
我的意图大家应该明白吧,在这里应该怎么做呢?

[解决办法]
vector<int> fun()
{
vector<int> result;
return result; //或者return move(result);
}

[解决办法]
在这里完成右值引用,你和平常一样写代码就好了,标准库中的vector在C++11中已添加了支持,比如下面的赋值重载(gcc 4.7)
C/C++ code
#ifdef __GXX_EXPERIMENTAL_CXX0X__      /**       *  @brief  %Vector move assignment operator.       *  @param  __x  A %vector of identical element and allocator types.       *       *  The contents of @a __x are moved into this %vector (without copying).       *  @a __x is a valid, but unspecified %vector.       */      vector&      operator=(vector&& __x) noexcept(_Alloc_traits::_S_nothrow_move())      {         //内容略      }
[解决办法]
C/C++ code
#include <vector>void fun(std::vector<int>& arg){    std::vector<int> result;    //对result有插入等操作    //return result;   arg = std::move(result);}int main(){    std::vector<int> myVec;    fun(myVec);  return 0;}
[解决办法]
探讨
引用:

你应该只需要将参数的类型设置为vector<int>&amp;amp;&amp;amp;即可,然后在传参的时候直接调用fun

参数类型?

[解决办法]
你要想想为什么会报错,当fun返回之后,你的result被释放掉了,你的obj获得的是一个野指针。
但是move(fun())获得的是一个临时变量的指针,着就是区别。
[解决办法]
你的代码没有右值出现,所以move用错了
[解决办法]
vector<int>&& fun()

返回值错了!!!

vector<int> fun(); //返回一个右值!不是一个右值引用 !!
[解决办法]
看了下stackover上面的讨论,is_move_constructible原名是have_move_constructible
他这里只是说有这个move_constructor函数才返回1,你可以在你的代码中增加A(const A&)这个函数试试看看结果是不是会不一样吧。
[解决办法]
这说明这个模板并非测试所传递的类型是否包含move_constructor函数,他仅仅测试T t = T();(这里引用http://stackoverflow.com/questions/7054952/type-trait-for-moveable-types讨论中的)原文是T t=T {};我认为是T();所以实际的效果和这个模板的名字完全就不搭调。
[解决办法]
探讨

这说明这个模板并非测试所传递的类型是否包含move_constructor函数,他仅仅测试T t = T();(这里引用http://stackoverflow.com/questions/7054952/type-trait-for-moveable-types讨论中的)原文是T t=T {};我认为是T();所以实际的效果和这个模板的名字完全就不搭调。

[解决办法]
探讨

引用:
return 语句加多一个move() 就可以了.


我写过了,不过现在看来问题不在这儿吧

[解决办法]
move只是一个函数模板 用来返回右值引用的,用move函数的目的只是为了触发move操作。如果库本身实现了move语义,那么你只需要标明那些地方是右值引用即可

热点排行
Bad Request.