【问题标题】:Can anyone explain this paragraph of the current C++0x standard draft?谁能解释当前 C++0x 标准草案的这一段?
【发布时间】:2011-04-06 11:23:43
【问题描述】:

任何人都可以从ISO N3242§3.2,第二点解释这个陈述

一个表达式可能被计算,除非它是一个未计算的操作数 (第 5 条)或其子表达式。变量或非重载 名称显示为潜在求值表达式的函数是 odr-used 除非它是一个满足出现在 持续的 表达式 (5.19) 和左值到右值的转换 (4.1) 是 立即地 应用。如果它显示为可能已评估,则此为 odr-used 表达 (包括作为主体中隐式转换的结果 一种 非静态成员函数 (9.3.1))。

ISO 2003 标准:说

一个表达式可能会被计算,除非它出现在 不可缺少的 常量表达式是必需的(见 5.19),是 大小 运算符(5.3.3),或者是 typeid 运算符的操作数和 表达 不指定多态类类型 (5.2.8) 的左值。一个 对象或 如果它的名字出现在一个非重载函数 潜在评估 表达。

这些语句的实际区别是什么?

任何人都可以借助示例/程序来解释这一点吗?

【问题讨论】:

  • @Andrea :不仅解释......我要求差异/比较..旧的和新的
  • 我试着总结一下标题中的问题,欢迎修正。

标签: c++ c++11


【解决方案1】:

“未计算的操作数”替换“是 sizeof 运算符 (5.3.3) 的操作数,或者是 typeid 运算符的操作数且表达式未指定多态类类型的左值 (5.2.8)”。它具有相同的基本目的,但并未尝试列出 C++0x 标准中未计算操作数的运算符的所有情况。例如,decltype 是一个新的。

“odr-used”替换了“used”,我想他们认为单独的“used”可能与标准中“use”一词的其他用法有歧义。不过,在这两种情况下,它都定义了与 ODR 相关的“使用”的含义。

所以这些并不是真正的变化,只是为 C++0x 更新了重新措辞。

这是一个变化:

变量或非重载函数 其名字显示为 潜在评估的表达式是 odr-used 除非它是一个对象 满足要求的 出现在常量表达式中 (5.19) 和左值到右值 立即转换 (4.1)
已申请。

对比

一个对象或非重载 如果出现函数名称,则使用函数 在潜在评估中
表达。

假设a 在全局范围内是static const int。那么在 C++03 中它就没有用在下面的语句中:

char x[a];

因为上下文需要一个常量表达式。但是,它用于以下情况:

void foo(int); foo(a);

因为上下文不需要常量表达式。

在 C++0x 中,a 在任何一种情况下都 odr-使用。它允许在常量表达式中,并且在函数调用中,立即应用左值-右值转换(因为foo 按值获取其参数,而不是引用)。所以它符合 C++03 中不存在的“除非”。

“潜在评估”的定义也有所不同。在第一个示例中,char x[a]a 可能会在 C++03 中进行评估,但不会在 C++0x 中进行评估。我没有检查标准中的其他任何内容是否使用“可能评估”,这可能会受到此更改的影响。如果只是在这里提到,那它的那部分并没有改变,只是异常已经从“潜在评估”转移到“使用”。

【讨论】:

  • 你能用另一个例子解释一下这个变化吗
  • 我没有得到一件事,但如果在声明中 char x[a]; a 未使用,那么编译器将如何知道数组的大小以将数组对象放在内存中?
  • @Mr.Anubis:对象a没有被使用,它的值是。由于此值在编译时已知,因此在运行时不需要该对象。
  • @SteveJessop 但是我仍然没有从标准声明中得到语言 An expression is **potentially evaluated** unless it appears where an integral constant expression is required ,我想问的是即使在编译时也没有评估 a (因为它是静态常量),编译器如何知道 a 的值。这只是我试图从标准中理解确切的措辞。再次感谢:)
  • 这是 jargpn 术语“潜在评估”的定义。不要假设因为它不是“潜在评估”,并且因为术语“潜在评估”包含“评估”一词,所以不能在编译时评估它。
猜你喜欢
  • 1970-01-01
  • 2011-09-01
  • 2017-04-22
  • 1970-01-01
相关资源
最近更新 更多