ron*_*nag 18 c++ noexcept c++11
我一直在阅读一些矛盾的文章,关于是否允许移动构造函数/赋值.
因此,我想问一下移动构造函数/赋值是否允许抛出最终的C++ 11标准?
Nic*_*las 25
移动构造函数一般是否允许抛出?是.他们应该吗?没有.
一般来说,你在其中所做的一切都不应该是任何可能引发的事情.你不应该分配内存,调用其他代码或类似的东西.编写移动构造函数的唯一原因是与其他人的内存指针和对象引用一起潜逃.您应该复制一些基本类型并将其他对象中的值清空.那些东西不应该扔掉.
所以虽然它被允许,但这不是一个好主意.如果您正在这样做,请重新考虑您在移动操作中所做的事情.
这是为了进一步阐明这一点。
似乎std::vector对于是否使用noexcept声明移动构造函数特别挑剔。如果这样做,则 std::vector 将使用它们。如果您不这样做,则 std::vector 将改用您的复制构造函数。至少在某些情况下。尤其是在内部数组调整大小之后,每当它在内部重新排列项目时。
您可以在这个示例中看到效果,其中没有声明 noexcept:
http://coliru.stacked-crooked.com/a/285cd07a9a52da3b
在这个例子中,它在哪里:
http://coliru.stacked-crooked.com/a/d043774ec4c279ec
在第一个示例中,std::vector 使用已在第二次和第三次插入时使用 push_back 的复制构造函数。在第二个示例中,它执行相同的操作,但使用移动构造函数。
| 归档时间: |
|
| 查看次数: |
2593 次 |
| 最近记录: |