gpt4 book ai didi

c++ - 如果 T 是 POD,std::array 是否保证是 POD?

转载 作者:IT老高 更新时间:2023-10-28 22:13:40 29 4
gpt4 key购买 nike

我目前正在编写一个 C++ 内存编辑库,对于读/写 API,我使用类型特征(std::is_pod、std::is_same)和 boost::enable_if 来提供 3 个重载:

  1. POD 类型。例如MyMem.Read(SomeAddress);
  2. 字符串类型。例如MyMem.Read>(SomeAddress); (这实际上并不读出 C++ 字符串,它读出 C 风格的字符串并将其转换为 C++ 字符串。)
  3. vector 类型。例如MyMem.Read>(SomeAddress, NumElem); (这实际上并不读取 vector ,而是读取 C 样式的数组并将其转换为 vector 。)

重载 2 和 3 只是重载 1 的“包装器”。(因此,如果您正在读取 std::vector 或 std::basic_string 并且 T 不是 POD,它将失败,应该如此。)

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

我编写了使用 std::array 的代码,然后打算添加另一个重载来检测和处理 std::array 类型,但我不小心点击了编译,令我惊讶的是它成功了!

我目前正在使用 MSVC 10,事实证明,对于 std::array,如果 T 是 POD,则 std::array 是 POD。 (这意味着我可以只使用重载 1 并且它可以工作。)

我的问题是,这是由 C++ 标准保证还是由实现决定。

我知道我可以自己检查标准,但我对自己的信任不如对本网站上的一些语言律师的信任,所以我认为最好获得“第二意见”。 ;)

谢谢

附:此处提供的代码(它是一个仅限 header 的库): http://code.google.com/p/hadesmem/source/browse/trunk/HadesMem-v2/Hades-Memory/Hades-Memory/MemoryMgr.h#86

最佳答案

§23.3.1:

An array is an aggregate (8.5.1) that can be initialized with the syntax array a<T, N> = { initializer-list }; where initializer-list is a comma separated list of up to N elements whose types are convertible to T.

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

或者,直言不讳,可以将 §9/5(定义平凡的类)9/6(定义标准布局)和 9/9(将前面的要求合并到 POD)的要点与 8.5 的要点进行比较.1/1,它定义了聚合。

8.5.1:

An aggregate is an array or a class (Clause 9) with no user-provided constructors (12.1), no brace-or-equal- initializers for non-static data members (9.2), no private or protected non-static data members (Clause 11), no base classes (Clause 10), and no virtual functions (10.3).

第 9 条中的要求确实涵盖了 array只要它的元素类型也是 POD 并且实现没有声明 operator=move里面 array除了规范。

真的肛门,17.5.2.2 说

  1. For the sake of exposition, Clauses 18 through 30 and Annex D do not describe copy/move constructors, assignment operators, or (non-virtual) destructors with the same apparent semantics as those that can be generated by default (12.1, 12.4, 12.8).
  2. It is unspecified whether the implementation provides explicit definitions for such member function signa- tures, or for virtual destructors that can be generated by default.

template class array 的伪代码中的注释是

// No explicit construct/copy/destroy for aggregate type

是否 construct/copy/destroy包括operator= (作业)或move ?它可能应该,但我不认为,通过最严格的阅读,它确实如此。

请注意,这不仅会“影响” POD 特性,还会影响 Johannes 提到的微不足道的可复制性。

关于c++ - 如果 T 是 POD,std::array<T, S> 是否保证是 POD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3674247/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com