std::pair
和只有两名成员的std::tuple
有区别吗? (除了明显的std::pair
需要两个,只有两个成员和tuple
可能会少...)
有一些差异:
std::tuple
永远不会是standard-layout(至少,它不是必须符合标准)。如果std::pair<T, Y>
和T
都是标准布局,那么每个Y
都是标准布局。pair
的内容比使用tuple
容易一些。你必须在tuple
案例中使用函数调用,而pair
案例只是一个成员字段。但那是关于它的。
这是一个非常晚的答案,但请注意,因为std::pair
是使用成员变量定义的,所以使用empty base class optimization无法优化其大小(first
和second
必须占用不同的地址,即使其中一个或两个都是空类)。 second_type
所具有的任何对齐要求都会加剧这种情况,因此在最坏的情况下,得到的std::pair
将基本上是它需要的两倍。
std::tuple
只允许通过辅助函数进行访问,因此如果一个或另一个为空,它可以从任一类型派生,从而节省开销。 GCC的实现,至少,确实这样做...你可以通过标题来验证这一点,但也有this作为证据。
std::tuple
的名字更长(一个额外的角色)。用右手输入更多这些字符,大多数人都更容易打字。
也就是说,std::pair
只能有两个值 - 不是零,一,三或更多。两个值。但是,元组对值的数量几乎没有语义限制。因此,如果您确实想要指定一对值,则std::pair
是一种更准确,类型安全的类型。
对于它的价值,我发现std :: tuple的GDB输出要难以阅读。显然,如果你需要超过2个值,那么std :: pair将不起作用,但我认为这是支持结构的一点。
请注意,使用C ++ 17,可以使用相同的接口从两个元素的对和元组中读取数据。
auto [a, b] = FunctionToReturnPairOrTuple();
无需使用get<>
:)