有效的成员指针可以与 NULL 指针具有相同的值吗?

2024-01-11

根据ABI http://refspecs.linux-foundation.org/cxxabi-1.83.html#member-pointers,

指向数据成员的指针是相对于基地址的偏移量 包含它的类对象... NULL 指针表示为 -1

但是,根据 c++ 标准(我有修订版 4296,它位于4.11/1),

该类型的空成员指针值...是可区分的 从任何指向不是从空指针常量创建的成员的指针

-1 可以是有效的偏移量。

考虑这种情况:

#include <iostream>
using namespace std;

struct A {
    char a,b,c,d,e,f,g,h;
};

struct B {
    int i;
};

struct C : A,B {};

int main() {
    char C::*p=&C::h;
    char B::*q = static_cast<char B::*>(p);
    cout<< (q==nullptr) <<endl; //prints 1
}

在此代码中,我的编译器(x86_64-linux-gnu 上的 g++4.9.2)放置h在最后一个字节A、和地点B就在之后A in C。因此,偏移量为C::A::h从基地址C::B is -1.

(转换是合法的,它的结果可以用在动态类型 C 的对象上,即使它的静态类型是 B。标准说(5.2.9/12) “虽然 B 类不需要包含原始成员,但通过指向成员的指针执行间接操作的对象的动态类型必须包含原始成员”)

我有什么误解吗?

(我怀疑我的误解是关于“包含原始成员的类”这句话(5.2.9/12) - 考虑到C::h,该短语可能指的是A并且不C,但标准明确指出(10/2)“基类的成员也被视为派生类的成员”)


[expr.static.cast]/p12:

“指向成员的指针”类型的纯右值Dcv1 型T” 可以转换为“指向成员的指针”类型的纯右值B” 类型 cv2T, where B是一个基类(第 10 条)D,[...]。如果上课B包含原始成员,或者是基数或 衍生的 包含原始成员的类的类,结果 指向成员的指针指向原始成员。否则, 行为未定义。

“包含原始成员的类”是A. B不是以下类的基类或派生类A,因此行为是未定义的。

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

有效的成员指针可以与 NULL 指针具有相同的值吗? 的相关文章

  • CLR 2.0 与 4.0 性能比较?

    如果在 CLR 4 0 下运行 为 CLR 2 0 编译的 NET 程序会运行得更快吗 应用程序配置
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何在多线程C++ 17程序中交换两个指针?

    我有两个指针 pA 和 pB 它们指向两个大的哈希映射对象 当pB指向的哈希图完全更新后 我想交换pB和pA 在C 17中 如何快速且线程安全地交换它们 原子 我是 c 17 的新手 2个指针的原子无等待交换可以通过以下方式实现 inclu
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • JNI 将 Char* 2D 数组传递给 JAVA 代码

    我想从 C 代码通过 JNI 层传递以下指针数组 char result MAXTEST MAXRESPONSE 12 12 8 3 29 70 5 2 42 42 在java代码中我写了以下声明 public static native
  • 从客户端访问 DomainService 中的自定义对象

    我正在使用域服务从 Silverlight 客户端的数据库中获取数据 在DomainService1 cs中 我添加了以下内容 EnableClientAccess public class Product public int produ
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 使用 LINQ to SQL 时避免连接超时的最佳实践

    我需要知道在 net 应用程序中使用 LINQ to SQL 时避免连接超时的最佳实践 特别是在返回时IQueryable
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 启动时的 Excel 加载项

    我正在使用 Visual C 创建 Microsoft Excel 的加载项 当我第一次创建解决方案时 它包含一个名为 ThisAddIn Startup 的函数 我在这个函数中添加了以下代码 private void ThisAddIn
  • 识别 Visual Studio 中的重载运算符 (c++)

    有没有办法使用 Visual Studio 快速直观地识别 C 中的重载运算符 在我看来 C 中的一大问题是不知道您正在使用的运算符是否已重载 Visual Studio 或某些第三方工具中是否有某些功能可以自动突出显示重载运算符或对重载运
  • 在 NaN 情况下 to_string() 可以返回什么

    我使用 VS 2012 遇到了非常令人恼火的行为 有时我的浮点数是 NaN auto dbgHelp std to string myFloat dbgHelp最终包含5008角色 你不能发明这个东西 其中大部分为0 最终结果是 0 INF
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 保护 APK 中的字符串

    我正在使用 Xamarin 的 Mono for Android 开发一个 Android 应用程序 我目前正在努力使用 Google Play API 添加应用内购买功能 为此 我需要从我的应用程序内向 Google 发送公共许可证密钥
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 实体框架中的“it”是什么

    如果以前有人问过这个问题 请原谅我 但我的任何搜索中都没有出现 它 我有两个数据库表 Person 和 Employee 对每个类型的表进行建模 例如 Employee is a Person 在我的 edmx 设计器中 我定义了一个实体
  • 在 Windows Phone silverlight 8.1 上接收 WNS 推送通知

    我有 Windows Phone 8 1 silverlight 应用程序 我想使用新框架 WNS 接收通知 我在 package appxmanifest 中有
  • 如何在richtextbox中使用多颜色[重复]

    这个问题在这里已经有答案了 我使用 C windows 窗体 并且有 richtextbox 我想将一些文本设置为红色 一些设置为绿色 一些设置为黑色 怎么办呢 附图片 System Windows Forms RichTextBox有一个
  • 为boost python编译的.so找不到模块

    我正在尝试将 C 代码包装到 python 中 只需一个类即可导出两个函数 我编译为map so 当我尝试时import map得到像噪音一样的错误 Traceback most recent call last File

随机推荐

  • 在数组中查找几个感兴趣的区域

    假设我进行了一项实验 其中我让 python 程序运行了很长一段时间 在那段时间里 我对一些数量与时间的关系进行了多次测量 每次测量都以 1 到 3 秒之间的某个值分隔 所使用的时间步长比该值小得多 比如 0 01 秒 即使只取 y 轴 这
  • 使用 FFmpeg 中的 libavcodec 解码作品

    我正在尝试使用 libavcodec 解码作品 我可以单独使用 libopus 库来做到这一点 但我正在尝试使用 libavcodec 实现相同的目标 我试图弄清楚为什么它在我的情况下不起作用 我有一个 rtp 流并尝试对其进行解码 解码数
  • 在 Google Cloud Vision API 中指定响应语言

    我正在使用 Google Cloud Vision API 来检测给定图像中的地标 网络实体和其他内容 查看文档here https cloud google com vision docs libraries 我专门使用 images a
  • C# 选择列表中的元素作为字符串列表

    在 C 中 我需要将对象列表中特定属性的所有值获取到字符串列表中 List
  • 更改 ViewModel 的视图

    我正在尝试为 mt WPF 应用程序实现 MVVM 设计模式 为了将视图连接到视图模型 我使用ResourceDictionary 用于Application Resources 看起来像
  • StandardOpenOption.SPARSE 有什么用?

    Java 7 定义这个选项 http docs oracle com javase 7 docs api java nio file StandardOpenOption html SPARSE 但我无法理解它的用处 考虑这个简单的程序 在
  • Sql Server 2005 与 Windows 10 不兼容

    当我升级到 Windows 10 时 SQL Server 2005 可以工作 现在它无法工作 据 Microsoft 称 我读到它与 Windows 8 不兼容 对我来说 Windows 10 只是 Windows 8 的成熟版本 有什么
  • Scala Playframework 发送文件

    我有一串数据 是从数据库中的数据中获取的 我想将其发送给用户 但不创建文件的本地副本 例如 Ok MyString as file csv 但它不起作用 我该怎么做 您可以通过使用来做到这一点chunked与Enumerator 我也用过w
  • 触发 PHP 处理

    I ask a 类似的问题 https stackoverflow com q 5964407 2246380昨天 但这一切都变得令人困惑 我想我应该重新开始并尝试更好地解释它 我即将设计一个拍卖网站 与 eBay 非常相似 物品从 24
  • 表单验证和表单助手

    我仍然在 Play 2 0 中的表单验证和表单助手方面遇到困难 我有一个与 Twitter Bootstrap 一起使用的登录屏幕 所以我的登录表单如下所示 helper form routes Application authentica
  • 在 GitHub Actions 工作流程中缓存 APT 包

    我对我的 C 项目使用以下 Github Actions 工作流程 工作流程在约 40 秒内完成 但其中一半以上的时间都花在安装valgrind包及其依赖项 我相信缓存可以帮助我加快工作流程 我不介意多等几秒钟 但这似乎是对 GitHub
  • 将重音符号转换为 UTF-8 字符

    我有带有各种变音符号的 Rnw Latex 文档 Kri s hna and St o ne etc 当我编织文档时 它们正确翻译为Kri shna and St one etc R 或任何 R 包中是否有命令可以为我执行此转换 例如 co
  • Rails 5.2 Active Storage 清除/删除附件不会删除 Blob 或附件记录

    我正在使用 Rails 5 2 并尝试使用 Amazon S3 设置 Active Storage 我的应用程序可以完全访问 S3 并且我可以附加avatar图像到user 但当我尝试删除头像时 遇到以下问题 gt user avatar
  • Elixir Exrm 中的参数化节点名称

    我想将 Exrm 与分布在单台机器上的 Erlang 一起使用 我需要创建多个版本 仅节点名称不同 我知道 我可以在中配置节点名称rel vm args 但它将是静态的 我可以以某种方式生成具有不同节点名称的多个版本吗 我正在研究同样的问题
  • 谷歌地图填充页面保留在标题下方

    我试图使标题 div 出现在 Google 地图上方 但让地图填充页面内容的所有其余部分 我遇到的问题是页面不断滚动 但我不希望它滚动 它滚动的量与标题高度相同 我尝试将溢出 隐藏 但这不起作用 因为虽然它不再滚动 但它也没有显示谷歌徽标和
  • 具有混合条件的 LINQ to SQL 复杂联接

    我有一个 SQL 语句 正在尝试将其转换为 LINQ to SQL 并且我已成功将其大部分转换 但遇到了一个我无法在 LINQ 中理解的语句 SQL 查询中令人头疼的部分是 SELECT FROM step INNER JOIN actio
  • 如何使用 Liquid 模板语言在布局中渲染模板?

    我正在尝试在液体布局中渲染液体模板 液体模板语言 而不是 CSS 液体布局内容 我似乎无法渲染布局部分 目前使用 assigns page name gt test layout Liquid Template parse File new
  • R Shiny Tabsets 同时处理

    我有一个RShiny应用程序 它计算不同选项卡中的多个统计数据 由于计算相当密集 我使用submitButton以防止发生反应 我的问题是现在每个计算 全部在不同的选项卡集中 都将输出写入文件夹 我想要Shiny初始化时为所有选项卡集写入输
  • 计算文件中特定字符串的出现次数

    这是我已经处理过的代码 while lineContents tempFileReader readLine null String lineByLine lineContents replaceAll System getProperty
  • 有效的成员指针可以与 NULL 指针具有相同的值吗?

    根据ABI http refspecs linux foundation org cxxabi 1 83 html member pointers 指向数据成员的指针是相对于基地址的偏移量 包含它的类对象 NULL 指针表示为 1 但是 根