例子是:
struct S { int n; };
auto f() {
S x { 1 };
constexpr S y { 2 };
return [&](bool b) { return (b ? y : x).n; };
}
auto g = f();
int m = g(false); // undefined behavior: access of x.n outside its lifetime
int n = g(true); // OK, does not access y.n
相关规则是:
将左值到右值的转换应用于表达式E时
未访问引用对象中包含的值。
我对表达式y. n
表示怀疑,它指出n
未使用。
根据规则:
表达式E的一组潜在结果定义如下:
根据项目符号3,表达式y.n
的潜在结果是y
本身,而n
确实是y
的一个成员,这是y.n
的潜在结果。然而,我不同意不使用odr的说法。
根据这条规则:
basic.def.odr#4.2
名称显示为潜在求值表达式E的变量x被E使用,除非
左值-右值转换应用于表达式y. n
,其潜在结果仅包含对象表达式y
而不是n
。因此,根据[basic.def.odr#4.2],名为n
的变量由表达式n
使用。因此,g(true)
应该是未定义的行为。如何解释这个例子?是错误的例子吗?
您的推理的问题是[conv.lval]/3.2
不要求n
不使用。有问题的表达式是E=(b? y: x). n
。潜在结果集是{x, y}
。E
的评估,当b=true
时,最终将导致y
的评估。因此,我们可以设置Ex=y
,我们现在发现“对E
的评估导致对E的一组潜在结果的成员
Ex
的评估”是一个真实的语句。该子句现在只要求Ex=y
命名一个在Ex
中未使用odr的变量。让我重复一遍,因为我认为这就是你出错的地方:[conv.lval]/3.2
询问Ex
odr-use本身(或者,实际上,它命名的变量)。我们要找的是表达式y
不odr-use变量y
的证明。成员访问n
并不重要。
好吧,我们继续看
[basic.def.odr]/4
一个变量
x
,其名称显示为可能评估的表达式E
被E
使用,除非
x
是一个非引用类型的变量,可在常量表达式中使用,并且没有可变的子对象,E
是应用左值到右值转换([conv.lval]
)的非易失性限定非类类型表达式的潜在结果集的一个元素,或
-
请注意,这里的
E
不是我们在[const.lval]/3.2
中开始使用的E=(b? y: x). n
。E
是我们正在测试y
的odr使用的表达式。让我们将其命名为E'
。然后E'=Ex=y
,因为我们再次检查表达式y
odr-是否使用变量y
。条件的第一部分成立;y
是一个非引用类型的变量,可用于常量表达式,并且没有可变的子对象。现在,E'=y
是原始E
潜在结果集的元素吗(因为E
是应用左值-右值转换的非易失性限定类类型的表达式)?是的,我们已经讨论过了,y
是E
的潜在结果之一。因此,Ex
不使用y
。这完成了[conv.lval]/3.2
的先决条件:我们现在知道(b? y: x). n
在评估左值-右值转换时不访问值y. n
。因此,没有UB。再次,请注意n
基本上没有出现在我们的推理中。
但是,我搞错了: **(退出#pid<0.70.0>)退出于:genserver.call(MySupervisor,{:start_child,[#pid<0.70.0>,:Monitor,{:nonode@nohost,#pid<0.81.0>},{:erlang,:apply,[#function<0.118488666 in file:test.exs>,[“long st ring”]]
我正在测试
本文向大家介绍关于多个Ajax请求执行返回先后的问题示例探讨,包括了关于多个Ajax请求执行返回先后的问题示例探讨的使用技巧和注意事项,需要的朋友参考一下 有时候在一个业务事件处理流程上,可能会遇到点击了一个按钮或者其他事件触发了一个动作 需要执行两个以上的Ajax请求,但是可能要顾虑到Ajax请求执行的先后顺序,有时候Ajax请求顺序出问题,会导致各种问题 例如现在有两个ajax事件,分别为aj
为什么要写这本书 随着比特币的火热,区块链正在成为比肩大数据、VR、机器学习等目前炙手可热的技术之一,世界各国政府、国际性大公司纷纷布局,试图把区块链用到实际中去。但是,区块链开发技术门槛高,可供学习参考的资料少,目前市场上的书籍大多是理论介绍性的,涉及到开发的书籍也多以简单的Api调用为主,没有一本深入区块链技术核心,从代码深度去完整讲述如何开发设计区块链产品的。本书弥补了这个空白,基于一个实际
本文向大家介绍八皇后问题的相关C++代码解答示例,包括了八皇后问题的相关C++代码解答示例的使用技巧和注意事项,需要的朋友参考一下 八皇后问题即指在一个8*8的棋盘上放置8个皇后,不允许任何两个皇后在棋盘的同一行、同一列和同一对角线上。关键字:递归、上溯.通用技巧: 经观察发现,对8 x 8的二维数组上的某点a[i][j](0<=i,j<=7) 其主对角线(即左上至右下)上的每个点的i-j+7的值
本文向大家介绍Spring实战之依赖关系注入之后的行为示例,包括了Spring实战之依赖关系注入之后的行为示例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Spring实战之依赖关系注入之后的行为。分享给大家供大家参考,具体如下: 一 配置 二 接口 1 Axe 2 Person 三 Bean 1 Chinese 2 SteelAxe 四 测试类 五 测试结果 Spring实例化依赖be