当前位置: 首页 > 知识库问答 >
问题:

关于[conv.lval#2.2]之后的示例的问题

郎鸿雪
2023-03-14

例子是:

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时

  1. E未进行潜在评估,或

未访问引用对象中包含的值。

我对表达式y. n表示怀疑,它指出n未使用。

根据规则:

表达式E的一组潜在结果定义如下:

  • 如果E是一个id表达式([expr.prim.id]),则该集合只包含E。

根据项目符号3,表达式y.n的潜在结果是y本身,而n确实是y的一个成员,这是y.n的潜在结果。然而,我不同意不使用odr的说法。

根据这条规则:
basic.def.odr#4.2

名称显示为潜在求值表达式E的变量x被E使用,除非

  • x是一个非引用类型的变量,在常量表达式中可用,并且没有可变的子对象,E是应用左值到右值转换([conv.lval])的非易失性限定非类类型表达式的潜在结果集的一个元素

左值-右值转换应用于表达式y. n,其潜在结果仅包含对象表达式y而不是n。因此,根据[basic.def.odr#4.2],名为n的变量由表达式n使用。因此,g(true)应该是未定义的行为。如何解释这个例子?是错误的例子吗?

共有1个答案

司徒兴思
2023-03-14

您的推理的问题是[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询问Exodr-use本身(或者,实际上,它命名的变量)。我们要找的是表达式y不odr-use变量y的证明。成员访问n并不重要。

好吧,我们继续看[basic.def.odr]/4

一个变量x,其名称显示为可能评估的表达式EE使用,除非

  • x是一个非引用类型的变量,可在常量表达式中使用,并且没有可变的子对象,E是应用左值到右值转换([conv.lval])的非易失性限定非类类型表达式的潜在结果集的一个元素,或

请注意,这里的E不是我们在[const.lval]/3.2中开始使用的E=(b? y: x). nE是我们正在测试y的odr使用的表达式。让我们将其命名为E'。然后E'=Ex=y,因为我们再次检查表达式yodr-是否使用变量y。条件的第一部分成立;y是一个非引用类型的变量,可用于常量表达式,并且没有可变的子对象。现在,E'=y是原始E潜在结果集的元素吗(因为E是应用左值-右值转换的非易失性限定类类型的表达式)?是的,我们已经讨论过了,yE的潜在结果之一。因此,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