C++ “offsetof”是什么意思;“有条件支持”;对于C+中的非标准布局类+;17?

C++ “offsetof”是什么意思;“有条件支持”;对于C+中的非标准布局类+;17?,c++,language-lawyer,c++17,offsetof,C++,Language Lawyer,C++17,Offsetof,C++17标准中规定: 有条件地支持将offsetof宏与标准布局类以外的类型一起使用 以及: 有条件支持 实现不需要支持的程序构造 我发现偏移量的定义不太精确 这是否意味着我可以安全地尝试将其用于非标准布局类 “有条件支持”与实现定义有何不同 编译器是否不支持生成诊断所需的特定类型的类的偏移 这是否意味着我可以安全地尝试将其用于非标准布局类 如果实施允许的话。有条件地支持意味着必须对此进行记录 “有条件支持”与实现定义有何不同 要引用此标准,请执行以下操作: -“实现不需要支持的程序构造”

C++17标准中规定:

有条件地支持将
offsetof
宏与标准布局类以外的类型一起使用

以及:

有条件支持

实现不需要支持的程序构造

我发现
偏移量的定义不太精确

  • 这是否意味着我可以安全地尝试将其用于非标准布局类

  • “有条件支持”与实现定义有何不同

  • 编译器是否不支持生成诊断所需的特定类型的类的偏移

这是否意味着我可以安全地尝试将其用于非标准布局类

如果实施允许的话。有条件地支持意味着必须对此进行记录

“有条件支持”与实现定义有何不同

要引用此标准,请执行以下操作:

-“实现不需要支持的程序构造”

-“行为,对于格式良好的程序结构和正确的数据,取决于实现和每个实现文档”

关键区别在于实现有什么选择。按照标准做,或者根本不做。而不是在没有选择拒绝的情况下,用几种方法中的一种来做

编译器是否不支持生成诊断所需的特定类型的类的偏移

如果是符合要求的实施,它将发布诊断(由@T.C.提供):


“如果一个程序违反了任何可诊断规则,或出现了本文档中描述为“有条件支持”的构造,而实现不支持该构造,则一致性实现应发出至少一条诊断消息。”

UB或格式不正确?不可否认,区别是微妙的。@Yakk-我在宏语义或标准布局类型的定义中没有看到任何称之为格式错误的东西(无论是否需要诊断)。我认为这给我们留下了UB。诚实地说,有条件地支持与选择定义未定义行为的实现没有什么不同。。。它仍然是不可移植的,并且仍然是危险的。展示UB的代码可能会导致时间旅行的鼻恶魔。UB显示无法运行的代码不会导致时间旅行鼻恶魔。格式错误的代码(使程序格式错误的代码)无法运行(无法访问)会导致时间旅行(维度跳跃?)鼻魔。差别是真实的;声称它只是UB,因为它没有说它是病态的,这似乎过于乐观了。格式错误的程序没有标准对其提出的要求。抽象机执行UB的程序没有对其提出任何要求:“如果一个程序包含[…]本文件中描述为“有条件支持”的构造,当实现不支持该构造时,一致性实现应发出至少一条诊断消息。”IIRC
offsetof
正在为C++20进行修订,去掉“有条件支持”部分,添加稳定布局类的概念,和/或扩展标准布局的当前定义。但我不记得细节,也不记得我在哪里读到的:/@Morwenn-你想的是什么?@StoryTeller是的,看起来像:)