“潜在评估”与 C++03 中的“odr-used”意思相同吗?

2023-11-26

举个例子:

#include <iostream>

class A
{
public:
    static const int numberOfWheels = 4;
};

// const int A::numberOfWheels;

int main()
{
    std::cout << A::numberOfWheels << std::endl;
}

它是正式未定义的行为吗(UB) since A::numberOfWheels is used没有它的定义? (也可以看看here)。正如 C++03 所说:

如果使用该成员,则仍应在名称空间范围内定义 在程序和命名空间范围定义中不应包含 初始化程序。

我发现这个定义used在 C++03 中相当令人困惑,因为它指向潜在评估的表达:

对象或非重载函数是used如果它的名字出现在 潜在评估的表达。

根据我的疯狂猜测,它排除了诸如以下的表达式:

sizeof(A::numberOfWheels) ;
typeid(A::numberOfWheels).name() ;

但不一定是重载的表达式<<像上面的操作符。


从这两个缺陷报告来看,它的意图似乎应该与 ODR-used 非常相似:缺陷报告 48:未使用的静态成员的定义其中说(强调我的前进):

本来所有的静态数据成员还是要在外部定义的 类,无论它们是否被使用。

但该限制应该被取消,以便静态数据 成员不需要在类外部定义,除非它们在类中使用 需要定义它们的方式,就像 命名空间范围的变量。尤其,如果一个整型/枚举常量 静态数据成员在类内部初始化,其地址为 从未被采用,我们同意没有命名空间范围定义 必需的。

这个修改的3.2p2如下:

表达式可能会被求值,除非它出现在哪里 需要整型常量表达式(参见 5.19 [expr.const] ), 是 sizeof 运算符的操作数 (5.3.3 [expr.sizeof] ),或者是 typeid 运算符的操作数和表达式不 指定多态类类型的左值 (5.2.8 [expr.typeid] )。

and 缺陷报告 82:“使用”常量表达式的定义:

3.2 basic.def.odr 第 2 段中关于“可能 评估”是不完整的。它不区分表达式 哪些用作“积分常量表达式”,哪些是 不是;它也不区分对象地址的用途 被采取的和那些没有被采取的。 (一个合适的定义 可以写“地址已获取”而无需实际说出“地址”。)

但是标准中的措辞没有被修改以包含任一缺陷报告中声明的意图,并且不清楚原因,只是添加了需要整数常量表达式的例外情况。

Update

缺陷报告454:何时需要静态数据成员的定义?最终使标准的措辞与缺陷报告 48 中表达的意图保持同步,其中表示:

由于核心问题 48 的解决,当前的 C++ 标准与现有实践和用户不同步 对具有 const 的静态数据成员的定义的期望 涉及整型或常量枚举类型。基本上是什么 当前的实现只是在以下情况下才需要定义 获取常量的地址。例子:

void f() {

  std::string s;
  ... 

  // current implementations don't require a definition
  if (s.find('a', 3) == std::string::npos) {
   ...
  }

不过,根据标准的字面意思,上述内容需要一个定义 npos,因为表达式 std::string::npos 可能是 评价。我认为这个问题可以通过简单的方法轻松解决 更改 9.4.2 class.static.data 第 4 段、9.4.2 class.static.data 第 5 段和 3.2 basic.def.odr 第 3 段。

所以对于C++03部分[基本.def.odr]旨在涵盖接近我们认为的 C++11 中使用的 odr 规则。随后对 C++11 规则进行了更改缺陷报告712这使得 C++11 更接近 C++14 规则。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“潜在评估”与 C++03 中的“odr-used”意思相同吗? 的相关文章

  • 如何使用 C# 中的参数将用户重定向到 paypal

    如果我有像下面这样的简单表格 我可以用它来将用户重定向到 PayPal 以完成付款
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • WCF RIA 服务 - 加载多个实体

    我正在寻找一种模式来解决以下问题 我认为这很常见 我正在使用 WCF RIA 服务在初始加载时将多个实体返回给客户端 我希望两个实体异步加载 以免锁定 UI 并且我想利用 RIA 服务来执行此操作 我的解决方案如下 似乎有效 这种方法会遇到
  • 按成员序列化

    我已经实现了template
  • 在结构中使用 typedef 枚举并避免类型混合警告

    我正在使用 C99 我的编译器是 IAR Embedded workbench 但我认为这个问题对于其他一些编译器也有效 我有一个 typedef 枚举 其中包含一些项目 并且我向该新类型的结构添加了一个元素 typedef enum fo
  • 为什么当实例化新的游戏对象时,它没有向它们添加标签? [复制]

    这个问题在这里已经有答案了 using System Collections using System Collections Generic using UnityEngine public class Test MonoBehaviou
  • 如何使用 ICU 解析汉字数字字符?

    我正在编写一个使用 ICU 来解析由汉字数字字符组成的 Unicode 字符串的函数 并希望返回该字符串的整数值 五 gt 5 三十一 gt 31 五千九百七十二 gt 5972 我将区域设置设置为 Locale getJapan 并使用
  • OleDbDataAdapter 未填充所有行

    嘿 我正在使用 DataAdapter 读取 Excel 文件并用该数据填充数据表 这是我的查询和连接字符串 private string Query SELECT FROM Sheet1 private string ConnectStr
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 为什么编译时浮点计算可能不会得到与运行时计算相同的结果?

    In the speaker mentioned Compile time floating point calculations might not have the same results as runtime calculation
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • C++ 中类级 new 删除运算符的线程安全

    我在我的一门课程中重新实现了新 删除运算符 现在我正在使我的代码成为多线程 并想了解这些运算符是否也需要线程安全 我在某处读到 Visual Studio 中默认的 new delete 运算符是线程安全的 但这对于我的类的自定义 new
  • C++ 标准是否指定了编译器的 STL 实现细节?

    在写答案时this https stackoverflow com questions 30909296 can you put a pimpl class inside a vector我遇到了一个有趣的情况 这个问题演示了这样一种情况
  • 如何防止用户控件表单在 C# 中处理键盘输入(箭头键)

    我的用户控件包含其他可以选择的控件 我想实现使用箭头键导航子控件的方法 问题是家长控制拦截箭头键并使用它来滚动其视图什么是我想避免的事情 我想自己解决控制内容的导航问题 我如何控制由箭头键引起的标准行为 提前致谢 MTH 这通常是通过重写
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐