C++17
cppreference
Structured binding 的宣告有以下三種
Description:
cv
代表的是cv-qualified type
,意思是const
或者volatile
,這裡的auto
可能是const
或者volatile
。(從C++20開始,這裡的auto
可能是const
, static
或者thread_local
,不再包含volatile
)&
或者&&
union
的資料型態。如果這個 expression 是指向任意一個 identifier-list 中的identifier,那這個宣告是 ill-formed的。Structured binding declaration 在 identifier-list 中宣告了所有的變identifier,並且將每個 identifier 綁定到 expression 中的元素或子物件中。這樣引入的綁定稱為結構化綁定。
以下用表示 expression(e) 的資料型態,因此,與std::remove_reference_t<decltype((e))>
相同。
Structured binding declaration 根據的型態,提供下列三種不同的綁定
union
型態,並且std::tuple_size<E>
是一個完整的型態union
型態,並且std::tuple_size<E>
不是一個完整的型態每個 identifier-list 中的identifier 作為lvalue
對應到 array 中的元素,兩邊的元素個數應該一致。
每個identifier 的引用型態等於array元素的型態,要注意若有cv
,則變數也會有這些cv
。
std::tuple_size<E>::value
必須是well-formed的不變整數,identifier 的數量應該與std::tuple_size<E>::value
相等。
對於每個型態是reference to std::tuple_element<i, E>::type
的identifier,若他的 initializer 是lvalue
,則為lvalue reference
,否則為rvalue reference
。i-th variable的 initializer為:
e.get<i>()
: 找到至少一個function template宣告,且第一個 template parameter不是型態參數的 function template。get<i>(e)
: Otherwise。get只會用ADL查找。在這些 initializer中,若是lvalue reference
(這只會在 ref-qualifier是&或者是&&且是lvalue時發生)則e
是lvalue
,除此之外都是xvalue,i
是一個 std::size_t
prvalue,而<i>
則都是在表示一個 template parameter list。
每個變數都跟有相同的storage duration。每個identifier 變成左值的名稱,該左值引用綁定到變數的物件。第i個identifier的引用型態是std::tuple_element<i, E>::type
identifier 的數量必須與 non-static data members的數量相同,且不能是union
型別。每個identifier 就是物件成員的別稱。