2016-11-15 58 views
6

爲什麼std :: tuple會分解爲右值引用?爲什麼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主幹。 我本來會期待簡單的類型,例如

same_type<decltype(i), int>{}; 

Live example

回答

9

GCC的bug。應用於結構化綁定的decltype返回引用類型,這對於類似元組的情況是由std::tuple_element返回的確切類型。換句話說,這裏的語言很難試圖隱藏這些實際上是引用的事實。

[dcl.type.simple]/4

對於表達e,通過decltype(e)表示的類型被定義爲 如下:

  • 如果e是一個括號的ID-表達命名結構結合([ dcl.struct.bind]),decltype(e)是在結構化綁定聲明的 規範中給出的引用類型;
  • [...]

[dcl.struct.bind]/3

否則,如果該表達式std::tuple_size<E>::value是 合式積分常量表達式[...]鑑於所指定的類型Ti 通過std::tuple_element<i, E>::type,每個vi是 變量的類型「參考Ti」用初始值初始化, 其中th如果初始值爲 左值並且右值引用是其他值,則e引用是左值引用;引用的類型是Ti

+3

謝謝。我已重新打開https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78358 – octoploid

相關問題