[英]What is the difference between std::tie and std::forward_as_tuple
[英]Difference between std::pair and std::tuple with only two members?
std::pair
和只有兩個成員的std::tuple
之間有區別嗎? (除了明顯的std::pair
需要兩個而且只有兩個成員和tuple
可能有或多或少......)
有一些區別:
標准並不要求std::tuple
永遠是standard-layout 。 如果T
和Y
都是標准布局,則每個std::pair<T, Y>
都是標准布局。
獲取pair
的內容比獲取tuple
容易一些。 您必須在tuple
案例中使用 function 調用,而pair
案例只是一個成員字段。
但僅此而已。
std::tuple
的名稱更長(一個額外的字符)。 更多這些字符是用右手輸入的,因此大多數人更容易輸入。
也就是說, std::pair
只能有兩個值——不是零、一、三個或更多。 兩個值。 然而,元組對值的數量幾乎沒有語義限制。 因此,如果您確實想要指定一對值,則std::pair
是一種更准確的類型安全類型。
這是一個非常晚的答案,但請注意,因為std::pair
是用成員變量定義的,所以它的大小不能使用空基 class 優化來優化( first
和second
必須占用不同的地址,即使一個或兩個都是空類) . 無論 alignment 要求second_type
所具有的任何情況都會加劇這種情況,因此在最壞的情況下,生成的std::pair
基本上將是所需大小的兩倍。
std::tuple
僅允許通過輔助函數進行訪問,因此如果一個或另一個為空,它可以從任一類型派生,從而節省開銷。 至少,GCC 的實現肯定是這樣做的……您可以通過標頭來驗證這一點,但也有這作為證據。
請注意,使用 C++ 17,可以使用相同的接口從具有兩個元素的對和元組中讀取數據。
auto [a, b] = FunctionToReturnPairOrTuple();
無需使用get<>
:)
對於它的價值,我發現 std::tuple 的 GDB output 更難閱讀。 顯然,如果您需要超過 2 個值,則 std::pair 將不起作用,但我確實認為這是支持結構的一點。
也許值得注意的是,cppreference 指出:
“一對是具有兩個元素的 std::tuple 的特定情況。”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.