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

非日常可复制类型的C++值表示

西门品
2023-03-14

类型T的对象的对象表示形式是类型T的对象所占用的N个无符号char对象的序列,其中N等于sizeof(T)。类型T的对象的值表示是参与表示类型T的值的一组位。对象表示中不属于值表示的位是填充位。对于基本可复制的类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的值集的一个离散元素。

为什么突出显示的句子仅限于可复制的类型?是否因为一个非日常可复制对象的值表示中的一些位可能在其对象表示之外?这个答案和这个答案都暗示了这一点。

然而,在上面链接的答案中,对象的概念值是基于用户引入的语义。在第一个链接答案的示例中:

class some_other_type
{
    int a;
    std::string s;
};

标准委员会引入突出显示的句子是因为一个对象的语义“值”可以由用户决定(就像两个链接的答案一样),还是因为实现可以决定(或被迫)这样做,或者两者兼而有之?

谢谢你。

共有1个答案

拓拔弘化
2023-03-14

在我的解释中,你突出强调的句子的重点是这一部分:

对于基本可复制的类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的值集的一个离散元素。

基本上,标准的[basic.types]#4说“每个对象都有一组位O,这是它的对象表示形式,还有一组位V,这组位P=O而没有V是填充位。对于日常可复制的类型,VO的子集”。后者很重要,因为它意味着围绕O位集进行复制也可以安全地围绕V进行简单可复制类型的复制,从而保留值。在这里,如何为其他类型定义v与此无关(如果需要,请将其设置为整个抽象机器)。

回答评论中提出的订正问题:

如果11100001000100010001111是一个不可复制的对象的对象表示形式,为什么一个实现不能告诉它是什么意思?是因为有其他一些位(在这个对象表示之外)帮助决定对象的值吗?

让我们以std::string为例。它不是简单的可复制的,因为它必须处理内存管理。

 类似资料:
  • 我有一个关于常量类型的问题,这些常量被限制在特定的值,以及在GO中如何实现这些。假设我创建了一个类型,它有两个常量值和,我希望限制该类型()的用户创建类型的其他值。是否通过创建包并使值和可见,并使类型仅限于包含包来实现这一点?例如,请参见下面的代码 这是将类型限制为某些常量值的正确方法吗?

  • 问题内容: 我有一个关于将常量类型限制为某些值的问题,以及如何在Go中完成该操作。说我创建类型,其具有两个常数值和与我想限制该类型(用户从创建类型的其它值)。我是否可以通过创建一个程序包并使其值和可见性以及将类型限制为包含的程序包来实现此目的?例如,请参见下面的代码 这是将类型限制为某些常量值的正确方法吗? 问题答案: 缺陷 提议的解决方案以您想要的方式并不安全。可以使用无类型的整数常量来创建新值

  • 我遇到了T.3.8/4类型的值/对象表示的定义: 类型T的对象的对象表示形式是类型T的对象所占用的N个无符号char对象的序列,其中N等于sizeof(T)。对象的值表示形式是保存类型T的值的一组位。对于通常可复制的类型,值表示形式是对象表示形式中确定值的一组位,该值是实现定义的值集的一个离散元素。 我无法想象这些定义对于一个微不足道的可编译类型与对于任何其他类型有什么不同。什么严格的限制适用于一

  • 问题内容: 在Swift中,当您传递值类型时,对函数说一个数组。制作了数组的副本以供该函数使用。 但是https://developer.apple.com/library/ios/documentation/Swift/Conceptual/Swift_Programming_Language/ClassesAndStructures.html#//apple_ref/doc/uid/TP400

  • 我正在创建一个ios应用程序,它使用一个用flask python编写的服务器,当我连接到服务器注册一个用户时,我的服务器中不断出现一个“NoneType”对象不可订阅错误。py文件。基本上,我的问题是,是什么导致了这个错误,以及我如何能够修复这个错误。此外,如果有人能为我指出不同或更简单的方法的正确方向,我将不胜感激,谢谢! 这是服务器。py文件: 这是我在swft中的寄存器函数: 回溯: 这里