免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2214 | 回复: 8
打印 上一主题 下一主题

[C++] 编译器自动生成的move ctor的行为是? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-04-17 15:45 |只看该作者 |倒序浏览
本帖最后由 Frahm 于 2013-04-17 15:46 编辑

我很疑惑,std::is_move_constructible<T>::value的值总是true,比如我声明一个空类,它也是true, 所以我就认为编译器自动生成了对应的move ctor,然而经过测试,我发现不然。

  1. struct foo {
  2.         int* ptr;
  3. };

  4. int main() {
  5.         {               
  6.                 std::cout << std::is_move_constructible<foo>::value << '\n';
  7.                 foo f;
  8.                 f.ptr = (int*)12;
  9.                 foo f2(std::move(f));
  10.                 std::cout << f.ptr << ' ' << f2.ptr << '\n';
  11.         }
  12.         return 0;
  13. }
复制代码
输出的f.ptr和f2.ptr是一样的,我以为默认的行为会把f.ptr赋值为nullptr, 不然的话不是很危险吗。。。
我感觉编译器根本就没有自动生成move ctor。
也就是说std::is_move_constructible这个trait 没有用?
有没有能确切表示可以被move 构造的trait呢?

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2013-04-17 15:51 |只看该作者
复杂度好高,是编程还是被程序扁。。

论坛徽章:
0
3 [报告]
发表于 2013-04-17 15:55 |只看该作者
回复 2# linux_c_py_php


    啊?复杂度是指?

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
4 [报告]
发表于 2013-04-17 20:54 |只看该作者
回复 1# Frahm


    你显式声明下就是了,如果不放心的话:

  1. struct foo
  2. {

  3.     foo( foo&& ) = default;

  4.     foo& operator = ( foo&& ) = default;

  5. };
复制代码

论坛徽章:
0
5 [报告]
发表于 2013-04-17 20:58 |只看该作者
本帖最后由 Frahm 于 2013-04-17 20:59 编辑

回复 4# lost_templar


    额,vs11不支持这样用default,和delete。
另外我不是想为个别类写函数,而是想写模版类,特化处理不同情况

论坛徽章:
0
6 [报告]
发表于 2013-04-17 21:03 |只看该作者
本帖最后由 Frahm 于 2013-04-17 21:04 编辑

结论是
std::is_move_constructible, 这个trait基本没用, 因它不能判断一个类是否有move ctor, 它只能用来判断类T是否接受rvalue作为构造参数,而copy ctor在参数声明为const的时候也可以接收。
所以它不能判断一个类是否声明了T::T(T&&), 而是判断对于一个类T能否这么写 T t(T());
也有可能调用了T::T(const T&)

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
7 [报告]
发表于 2013-04-17 21:06 |只看该作者
回复 5# Frahm

你换编译器试试吧


   

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
8 [报告]
发表于 2013-04-17 23:57 |只看该作者
http://www.cplusplus.com/referen ... move_constructible/


输出的f.ptr和f2.ptr是一样的,我以为默认的行为会把f.ptr赋值为nullptr, 不然的话不是很危险吗。。。
应该是这个f move之后内容应该就是不确定的了,类有效但不可用。

move构造 这里看上去很像传递的意思。

我也没怎么看过新c++.


论坛徽章:
0
9 [报告]
发表于 2013-04-18 06:27 |只看该作者
会有trivial defaulted move ctor。
默认就是copy,不管清除状态。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP