Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Is std::array<;T、 S>;如果T是POD,则保证为POD? 我目前正在编写一个C++内存编辑库,对于读/写API,我使用类型特征(STD:IsPod,STD::ISSY)和Booo::Enable,如果提供3个重载: 豆荚类型。e、 g.MyMem.Read(SomeAddress) 字符串类型。e、 g.MyMem.Read>(SomeAddress);(这实际上并没有读出一个C++字符串,它读出一个C样式字符串并将其转换成C++字符串) 向量类型。e、 g.MyMem.Read>(SomeAddress,NumElem);(这实际上并没有读取向量,而是读取C样式数组并将其转换为向量。)_C++_Templates_Stl_Tr1_C++11 - Fatal编程技术网

Is std::array<;T、 S>;如果T是POD,则保证为POD? 我目前正在编写一个C++内存编辑库,对于读/写API,我使用类型特征(STD:IsPod,STD::ISSY)和Booo::Enable,如果提供3个重载: 豆荚类型。e、 g.MyMem.Read(SomeAddress) 字符串类型。e、 g.MyMem.Read>(SomeAddress);(这实际上并没有读出一个C++字符串,它读出一个C样式字符串并将其转换成C++字符串) 向量类型。e、 g.MyMem.Read>(SomeAddress,NumElem);(这实际上并没有读取向量,而是读取C样式数组并将其转换为向量。)

Is std::array<;T、 S>;如果T是POD,则保证为POD? 我目前正在编写一个C++内存编辑库,对于读/写API,我使用类型特征(STD:IsPod,STD::ISSY)和Booo::Enable,如果提供3个重载: 豆荚类型。e、 g.MyMem.Read(SomeAddress) 字符串类型。e、 g.MyMem.Read>(SomeAddress);(这实际上并没有读出一个C++字符串,它读出一个C样式字符串并将其转换成C++字符串) 向量类型。e、 g.MyMem.Read>(SomeAddress,NumElem);(这实际上并没有读取向量,而是读取C样式数组并将其转换为向量。),c++,templates,stl,tr1,c++11,C++,Templates,Stl,Tr1,C++11,重载2和重载3只是围绕重载1的“包装器”。(因此,如果您正在读取std::vector或std::basic_字符串,而T不是POD,它将失败,这是应该的。) 最近,我想使用std::array进行一系列读写操作,因为我知道在编译时要读写的数据的大小(我正在编写一个PE文件格式的包装器) 我编写了使用std::array的代码,然后打算添加另一个重载来检测和处理std::array类型,但我意外地点击了compile,让我惊讶的是它居然成功了 我目前使用的是MSVC 10,结果表明,对于std:

重载2和重载3只是围绕重载1的“包装器”。(因此,如果您正在读取std::vector或std::basic_字符串,而T不是POD,它将失败,这是应该的。)

最近,我想使用std::array进行一系列读写操作,因为我知道在编译时要读写的数据的大小(我正在编写一个PE文件格式的包装器)

我编写了使用std::array的代码,然后打算添加另一个重载来检测和处理std::array类型,但我意外地点击了compile,让我惊讶的是它居然成功了

我目前使用的是MSVC 10,结果表明,对于std::array,如果T是POD,那么std::array就是POD。(这意味着我可以使用重载1,它可以工作。)

我的问题是,这是否是由C++标准保证的,还是留给实现的。 我知道我可以自己检查标准,但我不相信自己,因为我信任这个网站上的一些语言律师,所以我想最好是获得“第二意见”。)

谢谢

此处提供的p.S.代码(仅为标题库): 根据POD的定义:

9节课

9POD结构是一个普通类和标准布局类,并且没有非POD结构、非POD联合(或此类类型的数组)类型的非静态数据成员。类似地,POD联合是一个联合,它既是普通类又是标准布局类,并且不具有非POD结构、非POD联合(或此类类型的数组)类型的非静态数据成员。POD类是一个POD结构或POD联合的类

[我的重点]

std::array
确实满足了作为一个普通的标准布局类模板的所有要求。因此,您的问题的答案是肯定的。

§23.3.1:

数组是一个聚合(8.5.1),可以用语法
array a={initializer list}初始化它
其中,初始值设定项列表是由最多N个元素组成的逗号分隔列表,这些元素的类型可转换为T

在C++03中,POD是根据聚合定义的:一个类,其中每个子对象都是本机的,或者聚合是POD。因此,通过向后兼容性,C++0x
std::array
是POD

或者,为了便于分析,可以将§9/5(定义琐碎类)、9/6(定义标准布局)和9/9(将前面的要求合并到POD中)的要点与8.5.1/1(定义聚合)的要点进行比较

8.5.1:

聚合是一个数组或类(第9条),没有用户提供的构造函数(12.1),没有大括号或相等的非静态数据成员初始值设定项(9.2),没有私有或受保护的非静态数据成员(第11条),没有基类(第10条),也没有虚拟函数(10.3)

事实上,第9条中的要求涵盖了
阵列
,只要其元素类型也是POD,并且除了规范之外,实现没有声明
操作符=
移动
内部
阵列

17.5.2.2说,真正的肛门

  • 为便于说明,第18条至第30条和附录D未描述复制/移动构造函数、赋值运算符或(非虚拟)析构函数,其表面语义与默认情况下生成的相同(12.1、12.4、12.8)
  • 未指定该实现是为此类成员函数签名提供显式定义,还是为默认情况下可以生成的虚拟析构函数提供显式定义
  • 模板类数组的伪代码中的注释是

    //聚合类型没有显式构造/复制/销毁

    construct/copy/destroy
    是否包括
    operator=
    (赋值)或
    move
    ?也许应该,但我不认为,严格地说,是这样的


    请注意,这不仅“影响”了POD的稳定性,而且还影响了Johannes提到的微不足道的可复制性。

    Potatoswatter在我的结论中发现了一个错误。C++明确地允许实现显式地定义赋值运算符“具有相同的表观语义”。这将使它成为一个非平凡的可复制类型。让它成为社区维基


    在我看来,您不想针对PODnes进行测试,而是针对可复制的琐碎内容进行测试,这是一种较少限制的方式。因为这就是C++0x约束类型可以与
    memcpy
    和friends一起使用的方式

    虽然我不认为有任何关于
    std::array
    的PODness的保证,但是有一些关于微不足道的可复制性的保证,如下所示(如果我在结论中没有得到错误的话)。正如我们所知,
    std::array
    是一个聚合,聚合是

    聚合是一个数组或一个类(第9条),没有用户提供的构造函数(12.1),没有大括号或同等值- 非静态数据成员的初始值设定项(9.2),无私有或受保护的非静态数据成员(第11条), 没有基类(第10条),也没有虚函数(第10.3条)

    而对于具有

    • 没有非平凡的副本构造函数(12.8)
    • 没有非平凡的移动构造函数(12.8)
    • 没有非平凡的复制赋值运算符(13.5.3、12.8)
    • 没有非平凡的移动分配运算符(13.5.3、12.8),以及