免费注册 查看新帖 |

Chinaunix

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

[C++] noexcept签名不影响copy/move的选择,这是VC的bug吗? [复制链接]

论坛徽章:
2
2015年迎新春徽章
日期:2015-03-04 10:16:532015元宵节徽章
日期:2015-03-06 15:53:22
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-06-17 09:04 |只看该作者 |倒序浏览
[Effective modern C++]上面说,vector::push_back当capacity不够的时候,会申请一块新的内存,把原有的内容copy或者move过去。
根据一个类的move构造函数是否是noexcept来判定,这样能够保证迁移到新的内存块的时候,有exception safety.

于是我做了一个实验

  1. #include<iostream>
  2. #include<vector>
  3. using namespace std;
  4. struct A{
  5.     A(){}
  6.     A(const A&){ cout << "copy ctor\n"; }
  7.     A(A&&){ cout << "move ctor\n"; }//是否noexcept,影响结果
  8. };
  9. int main()
  10. {
  11.     vector<A> vi(2);
  12.     size_t c = 0;
  13.     cout<<"========\n";
  14.     for (size_t i = 0; i<4; ++i)
  15.     {
  16.         cout<<"push_back...........\n";
  17.         vi.push_back(A());
  18.         if (vi.capacity()>c)
  19.         {
  20.             c = vi.capacity();
  21.             cout << c << endl;
  22.         }
  23.     }
  24.     return 0;
  25. }
复制代码
GCC/clang运行这个程序,push_back如果capacity不够了,那么会把原有的元素copy一份。如果我把move语义构造函数改成A(A&&)noexcept签名,那么调用的就是把原有的元素move一份。
这个和书上说的是一样的。

但是VC2013/2015我做的测试,无论我有没有加上noexcept,都是用move语义去搬移元素到新的内存块。这是VC实现的问题吗?
还是说,VC有特别的编译选项控制exception safe,默认是关闭的,打开了才是和GCC/clang一样的行为?

谢谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP