大佬教程收集整理的这篇文章主要介绍了c – Noexcept和copy,移动构造函数,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
现在我不明白为什么会这样.此外,Visual studio VC v140和gcc v 4.9.2似乎也有不同的做法.
我不明白为什么不这样做,例如这是一个问题.向量.我的意思是如果T没有,vector :: resize()应该如何能够提供强大的异常保证.正如我所看到的那样,矢量的异常级别将取决于T.无论是否使用复制或移动.
我理解noexcept只是对编译器进行异常处理优化的眨眼.
当使用Visual studio编译时,这个小程序在使用gcc编译时调用复制构造函数并移动构造函数.
include <iostream> #include <vector> struct foo { foo() {} // foo( const foo & ) noexcept { std::cout << "copy\n"; } // foo( foo && ) noexcept { std::cout << "move\n"; } foo( const foo & ) { std::cout << "copy\n"; } foo( foo && ) { std::cout << "move\n"; } ~foo() noexcept {} }; int main() { std::vector< foo > v; for ( int i = 0; i < 3; ++i ) v.emplace_BACk(); }
标准库期望所有用户类型始终提供基本异常保证.这种保证表明,当抛出异常时,所涉及的对象仍处于有效(如果未知)状态,没有资源泄露,没有违反基本语言不变量,并且没有发生远距离的怪异动作(最后一次)一个不是正式定义的一部分,但它实际上是一个隐含的假设).
Foo(const Foo& o);
如果此构造函数抛出,基本异常保证将为您提供以下知识:
>没有创建新对象.如果构造函数抛出,则不会创建该对象.
> o未被修改.它唯一的参与是通过const引用,所以不能修改它.其他案件属于“远距离的怪异行动”标题,或者可能是“基本语言不变”.
>没有资源被泄露,整个计划仍然是连贯的.
在移动构造函数中:
Foo(Foo&& o);
基本保证给予较少的保证. o可以修改,因为它通过非const引用涉及,因此它可以处于任何状态.
接下来,看看vector :: resize.它的实施通常遵循相同的方案:
void vector<T,A>::resize(std::size_t newSizE) { if (newSize == size()) return; if (newSize < size()) makesmaller(newSizE); else if (newSize <= capacity()) makeBiggerSimple(newSizE); else makeBiggerComplicated(newSizE); } void vector<T,A>::makeBiggerComplicated(std::size_t newSizE) { auto newMemory = allocateNewMemory(newSizE); constructAdditionalElements(newMemory,size(),newSizE); transferExisTingElements(newMemory); replaceInternalBuffer(newMemory,newSizE); }
这里的关键功能是transferExisTingElements.如果我们只使用复制,它有一个简单的保证:它不能修改源缓冲区.因此,如果操作抛出的任何时刻,我们可以破坏新创建的对象(请记住标准库绝对不能用于抛出析构函数),抛弃新缓冲区,然后重新抛出.矢量看起来好像从未被修改过.这意味着我们有强有力的保证,即使元素的复制构造函数只提供弱保证.
但是,如果我们使用移动,这不起作用.移动一个对象后,任何后续异常都意味着源缓冲区已更改.而且因为我们无法保证移动物体也不会抛出,我们甚至无法恢复.因此,为了保持强有力的保证,我们必须要求移动操作不会抛出任何异常.如果我们有,那我们没事.这就是为什么我们有move_if_noexcept.
至于MSVC和GCC之间的区别:自版本14以来,MSVC仅支持noexcept,并且由于仍在开发中,我怀疑标准库尚未更新以利用它.
以上是大佬教程为你收集整理的c – Noexcept和copy,移动构造函数全部内容,希望文章能够帮你解决c – Noexcept和copy,移动构造函数所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。