为了账号安全,请及时绑定邮箱和手机立即绑定

C+17引入的评估顺序保证是什么?

C+17引入的评估顺序保证是什么?

C++
慕尼黑5688855 2019-06-28 11:13:30
C+17引入的评估顺序保证是什么?投票产生的影响是什么?C+17评估令担保(P 0145)关于典型的C+代码?它对像这样的事情有什么改变?i=1; f(i++, i)和std::cout << f() << f() << f() ;或f(g(),h(),j());
查看完整描述

3 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

C+17禁止交织

在C+14中,以下内容不安全:

void foo(std::unique_ptr<A>, std::unique_ptr<B> );

foo(std::unique_ptr<A>(new A), std::unique_ptr<B>(new B));

在函数调用过程中,这里有四个操作

  1. new A

  2. unique_ptr<A>

    构造器
  3. new B

  4. unique_ptr<B>

    构造器

这些排序是完全未指定的,因此一个完全有效的排序是(1),(3),(2),(4)。如果选择了这个顺序,并且(3)抛出,那么来自(1)的内存泄漏-我们还没有运行(2),这将防止泄漏。


在C+17中,新规则禁止交织。来自[Intro.Execution]:

对于每一次函数调用F,对于F内发生的每一次求值A和不发生在F内但在同一线程上并作为同一信号处理程序(如果有的话)的一部分的每一次求值B,在B或B之前先对A进行排序。

这句话有一个脚注,内容如下:

换句话说,函数执行不相互交织。

这就给我们留下了两个有效的命令:(1),(2),(3),(4)或(3),(4),(1),(2)。没有具体说明采取了哪种订购,但这两种都是安全的。所有(1)(3)同时发生在(2)和(4)之前的命令现在都被禁止。


查看完整回答
反对 回复 2019-06-28
  • 3 回答
  • 0 关注
  • 432 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信