[英]Why does the standard allow a tuple of rvalue references to be assigned to by a tuple of lvalue references?
[英]Why does std::tuple decompose into rvalue references
為什么std :: tuple會分解成右值引用?
#include <tuple>
template <typename, typename> struct same_type;
template <typename T> struct same_type<T, T> {};
void foo() {
std::tuple tuple(1, 'a', 2.3, true);
auto[i, c, d, b] = tuple;
same_type<decltype(i), int &&>{};
same_type<decltype(c), char &&>{};
same_type<decltype(d), double &&>{};
same_type<decltype(b), bool &&>{};
}
使用gcc trunk編譯時沒有錯誤。 我本來期望普通類型,例如
same_type<decltype(i), int>{};
GCC錯誤。 應用於結構化綁定的decltype
返回引用的類型 ,對於類似元組的情況,它是std::tuple_element
返回的確切類型。 換句話說,語言在這里非常努力地隱藏這些實際上是引用的事實。
對於表達式
e
,由decltype(e)
表示的類型定義如下:
- 如果
e
是未命名的id-expression,命名結構化綁定([dcl.struct.bind]),則decltype(e)
是結構化綁定聲明規范中給出的引用類型;- [...]
否則,如果表達式
std::tuple_size<E>::value
是一個格式良好的整型常量表達式[...]給定由std::tuple_element<i, E>::type
指定的類型Ti
,每個vi
是用初始化程序初始化的“引用到Ti
”類型的變量,如果初始化程序是左值,則引用是左值引用,否則是引用左值引用; 引用的類型是Ti
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.