提问人:Enlico 提问时间:7/27/2023 最后编辑:Enlico 更新时间:7/28/2023 访问量:145
std::p air 的两个条目的销毁顺序是什么?
What is the order of destruction of the two entries of a std::pair?
问:
只允许使用 5 个标签,但请接受它,因为 c++20 和 c++23 也在列表中,因为我也想知道这些标准,以防自 c++17 以来发生任何变化。
标准是否指定了 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 的选择还是标准强制要求的?second
first
实际上,在草稿中快速搜索一下就会发现 §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;
这只是一个例子吗?还是一项任务?
答:
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 - 还有“假设”规则。你能从你的程序中检测函数声明顺序吗?不?
评论
std::pair