哈哈,开心,散分。。

iamnobody 2011-09-22 07:37:52
不用靠编译器那点小概率的优化了。。



matrix(const MyType&& rhs)
:m_rows(0),m_cols(0),m_pMtr(NULL)
{
swap((MyType&)rhs);
};



MyType& operator=(const MyType&&rhs){
swap((MyType&)rhs);
return*this;
};




...全文
459 103 打赏 收藏 转发到动态 举报
写回复
用AI写文章
103 条回复
切换为时间正序
请发表友善的回复…
发表回复
topcool99 2011-10-01
  • 打赏
  • 举报
回复
恭喜lz
木房子 2011-09-25
  • 打赏
  • 举报
回复
100
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 mingliang1212 的回复:]
........
要不,你看看我并未完善的源码
http://blog.csdn.net/mingliang1212/article/details/6795751
[/Quote]
大概看了一下,写的挺好的。我想说的是你的 swap 还可以这样声明

swap(matrix<Type,Alloc>&& rhs);

这样在 swap 的调用端,就不需要这样的强制类型转换了 swap((MyType&)rhs);,可以变成 swap(std::move(rhs)),代码漂亮,同时也起到注释的作用,谁看到这里都知道 rhs 要挂了。

还有你代码中很多这样的东西

MyType tmp(itrs.first,itrs.second,1);
swap(tmp);

都可以更简单的写成 swap(MyType(itrs.first,itrs.second,1));
包括你的 move assignment operator,也可以变成下面这样

MyType& operator const=(MyType&&rhs){
swap(std::move(rhs));
return*this;
};


可能这些在你看来都不怎么重要,不过我想说的是,你原来的 move constructor/assignment operator 声明成这样 MyType& operator=(const MyType&& rhs)。本身就暗示这你的设计存在漏洞。因为 const 和 MyType&& 表达的是冲突的思想。前者表示 "不要动 rhs",后者表示 "反正 rhs 马上就挂了,想怎么动它都可以",而实际上你要的是后者的意思。就因为你这种设计的冲突性,使得你后面不得不用 swap((MyType&)rhs); 强制类型转换的方法来表达自己真实的意图。
deconding 2011-09-23
  • 打赏
  • 举报
回复
不懂啊,不过接分开心
stackoverlow 2011-09-23
  • 打赏
  • 举报
回复
虽然不知道LZ在说什么,但还是觉得LZ好厉害。。。
FrankHB1989 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 73 楼 mingliang1212 的回复:]

引用 69 楼 frankhb1989 的回复:
就算不考虑std::swap的实现,这里的const和(MyType&amp;)也是多此一举。


如果不加const ,但是,临时对象的返回值是const,是不会被重载的。自己试试就知道了,详见 18楼
[/Quote]
有必要特意构造const xvalue么?只要想从const对象中转移资源,就必须破坏const correctness。那干嘛还要const?
想想默认实现提供的原型为什么首选非const参数吧。


qin_0 2011-09-23
  • 打赏
  • 举报
回复
快乐接分
feidegengao 2011-09-23
  • 打赏
  • 举报
回复
jfl
FrankHB1989 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 71 楼 mingliang1212 的回复:]

引用 43 楼 ri_aje 的回复:
引用 42 楼 mingliang1212 的回复:

用swap有两个原因,1。代码清晰。2。异常安全。
std move不是这时用的吧

std::move 就是这时候用的,就因为这个你的代码看着奇怪,我才问的。
std::move 也满足你使用 std::swap 的原因。
实际上新标准下的 std::swap 一般都是通过 std:……
[/Quote]
异常安全嘛……std::swap和std::move都noexcept。
ithzhang 2011-09-23
  • 打赏
  • 举报
回复
哈哈。开心。接分。
绿野耕夫 2011-09-23
  • 打赏
  • 举报
回复
还能接到点,哈哈
FrankHB1989 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 ri_aje 的回复:]

引用 71 楼 mingliang1212 的回复:

引用 43 楼 ri_aje 的回复:
引用 42 楼 mingliang1212 的回复:

用swap有两个原因,1。代码清晰。2。异常安全。
std move不是这时用的吧

std::move 就是这时候用的,就因为这个你的代码看着奇怪,我才问的。
std::move 也满足你使用 std::swap 的原因。
……
[/Quote]
不用swap光move也不行,得把指针成员处理掉。
临时对象析构时对指针做手脚就麻烦了。
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 mingliang1212 的回复:]

用swap有两个原因,1。代码清晰。2。异常安全。
std move不是这时用的吧
[/Quote]
std::move 就是这时候用的,就因为这个你的代码看着奇怪,我才问的。
std::move 也满足你使用 std::swap 的原因。
实际上新标准下的 std::swap 一般都是通过 std::move 实现的,这里使用 std::swap,而不用 std::move,有点画蛇添足的感觉。下面是 g++-4.6.1 std::swap 的一般实现。

#define _GLIBCXX_MOVE(__val) std::move(__val)
#define _GLIBCXX_FORWARD(_Tp, __val) std::forward<_Tp>(__val)
#else
#define _GLIBCXX_MOVE(__val) (__val)
#define _GLIBCXX_FORWARD(_Tp, __val) (__val)
#endif

template<typename _Tp>
inline void
swap(_Tp& __a, _Tp& __b)
{
// concept requirements
__glibcxx_function_requires(_SGIAssignableConcept<_Tp>)

_Tp __tmp = _GLIBCXX_MOVE(__a);
__a = _GLIBCXX_MOVE(__b);
__b = _GLIBCXX_MOVE(__tmp);
}
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 81 楼 mingliang1212 的回复:]

引用 74 楼 ri_aje 的回复:
引用 71 楼 mingliang1212 的回复:

引用 43 楼 ri_aje 的回复:
引用 42 楼 mingliang1212 的回复:

你看我的回复了吗?
我在跟你说,swap 那根就是多余的,无论是 std::swap 还是你自己的 swap。move constructor 就是 std::move 最应该用的地方。

……

std::move 一个参数的作用是调用这个move constructor,和move assignment你这样会递归的。
你有试验过吗?

要不,你看看我并未完善的源码
http://blog.csdn.net/mingliang1212/article/details/6795751
[/Quote]
看 79#,我发贴以后又想起来的。
iamnobody 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 ri_aje 的回复:]
引用 71 楼 mingliang1212 的回复:

引用 43 楼 ri_aje 的回复:
引用 42 楼 mingliang1212 的回复:

你看我的回复了吗?
我在跟你说,swap 那根就是多余的,无论是 std::swap 还是你自己的 swap。move constructor 就是 std::move 最应该用的地方。
[/Quote]

std::move 一个参数的作用是调用这个move constructor,和move assignment你这样会递归的。
你有试验过吗?

要不,你看看我并未完善的源码
http://blog.csdn.net/mingliang1212/article/details/6795751
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 78 楼 mingliang1212 的回复:]

引用 77 楼 ri_aje 的回复:
引用 73 楼 mingliang1212 的回复:

引用 69 楼 frankhb1989 的回复:
就算不考虑std::swap的实现,这里的const和(MyType&amp;)也是多此一举。


如果不加const ,但是,临时对象的返回值是const,是不会被重载的。自己试试就知道了,详见 18楼

建议楼主在仔细考虑……

临时对象的返回值是不是const 完全是自己定义的,自己定义const 的意义在于对外的安全,在类内可以精确地知道自己要操作的是不是临时对象,这是C++的新特性,我觉得它很快又会火起来了。
[/Quote]
"这是C++的新特性,我觉得它很快又会火起来了",这句话同意。
不过前半句不同意。因为当 move constructor 调用的时候,肯定是因为临时对象导致的,不需要你自己去特设设计一种机制保证。
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 74 楼 ri_aje 的回复:]

引用 71 楼 mingliang1212 的回复:

引用 43 楼 ri_aje 的回复:
引用 42 楼 mingliang1212 的回复:

用swap有两个原因,1。代码清晰。2。异常安全。
std move不是这时用的吧

std::move 就是这时候用的,就因为这个你的代码看着奇怪,我才问的。
std::move 也满足你使用 std::swap 的原因。
……
[/Quote]
又想了一下,主楼的那个 swap 用的也有道理,你忽视我 74# 的回复吧。
iamnobody 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 77 楼 ri_aje 的回复:]
引用 73 楼 mingliang1212 的回复:

引用 69 楼 frankhb1989 的回复:
就算不考虑std::swap的实现,这里的const和(MyType&)也是多此一举。


如果不加const ,但是,临时对象的返回值是const,是不会被重载的。自己试试就知道了,详见 18楼

建议楼主在仔细考虑考虑吧,69# 说的有道理。move semanti……
[/Quote]

临时对象的返回值是不是const 完全是自己定义的,自己定义const 的意义在于对外的安全,在类内可以精确地知道自己要操作的是不是临时对象,这是C++的新特性,我觉得它很快又会火起来了。
iamnobody 2011-09-23
  • 打赏
  • 举报
回复
用swap有两个原因,1。代码清晰。2。异常安全。
std move不是这时用的吧
ri_aje 2011-09-23
  • 打赏
  • 举报
回复
[Quote=引用 73 楼 mingliang1212 的回复:]

引用 69 楼 frankhb1989 的回复:
就算不考虑std::swap的实现,这里的const和(MyType&)也是多此一举。


如果不加const ,但是,临时对象的返回值是const,是不会被重载的。自己试试就知道了,详见 18楼
[/Quote]
建议楼主在仔细考虑考虑吧,69# 说的有道理。move semantics 就是要回收利用临时对象的资源,临时对象返回为 const,明白着是不让回收利用,这种设计背后的道理是什么呢?
加载更多回复(80)

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧