std::p air 的两个条目的销毁顺序是什么?

What is the order of destruction of the two entries of a std::pair?

提问人:Enlico 提问时间:7/27/2023 最后编辑:Enlico 更新时间:7/28/2023 访问量:145

问:

只允许使用 5 个标签,但请接受它,因为 c++ 和 c++ 也在列表中,因为我也想知道这些标准,以防自 以来发生任何变化。

标准是否指定了 a 的两个条目(不是 std::tuple,也不是其他容器)的销毁顺序?在标准草案的什么位置可以找到此信息?std::pair

另外,如果确实指定了顺序,从什么时候开始?

在我的 GCC 实现中,我看到了这一点

namespace std {
// ...
  template<typename _T1, typename _T2>
    struct pair
    : private __pair_base<_T1, _T2>
    {
      typedef _T1 first_type;    ///< The type of the `first` member
      typedef _T2 second_type;   ///< The type of the `second` member

      _T1 first;                 ///< The first member
      _T2 second;                ///< The second member
// ...

所以很明显,之前被销毁了,但它只是 GCC 的选择还是标准强制要求的?secondfirst


实际上,在草稿中快速搜索一下就会发现 §22.3.2 显示了该类的样子,它是这样开始的:std::pair

namespace std {
  template<class T1, class T2>
  struct pair {
    using first_type  = T1;
    using second_type = T2;

    T1 first;
    T2 second;

这只是一个例子吗?还是一项任务?

20 23 +17 C ++ 语言律师 std-pair 执行顺序

评论

0赞 Language Lawyer 7/28/2023
@nick这里至少要感谢基本的研究工作,比如在提出问题之前打开标准部分std::pair
0赞 Enlico 7/28/2023
@LanguageLawyer,请参阅非删除答案下的注释。
0赞 Language Lawyer 7/28/2023
它不会改变您在提出问题后才打开相关部分的事实

答:

4赞 j6t 7/27/2023 #1

该命令在标准中指定:

template<class T1, class T2>
  struct pair {
    using first_type  = T1;
    using second_type = T2;

    T1 first;
    T2 second;
    //...
  }

成员的定义没有被标记为“仅展览”,因此它们是强制性的。

评论

0赞 Enlico 7/27/2023
是的,我最终在你发帖之前就找到了它,但谢谢。我实际上会问:我怎么知道该代码是强制性的,而不仅仅是一个示例?我会发现一个不告诉它只是一个例子吗?
0赞 j6t 7/27/2023
一般来说,标准中写的规范。然而,偶尔,在介绍性部分会出现笼统的陈述“我们写 A 来表示 B,而不暗示 C”。因此,除非您阅读(并理解)了《标准》的全文,否则您无法确定段落的含义。不过,在这种特殊情况下,我不记得会有例外。
0赞 Nelfeal 7/27/2023
像你引用的班级概要真的是规范的吗?因为如果是这样,我希望成员函数的顺序也应该得到尊重,但 stdlibc++ 和 libc++ 都以不同的顺序声明它们。虽然我想这对成员函数没有区别......
0赞 Enlico 7/27/2023
@Nelfeal,我想我可以问一下,像你引用的班级概要真的是规范的吗?作为一个单独的问题:D
2赞 BoP 7/27/2023
@Nelfeal - 还有“假设”规则。你能从你的程序中检测函数声明顺序吗?不?