2017-06-22 104 views
26

考慮這樣一個例子:結構化綁定的decltype(auto)應該是一個引用嗎?

#include <iostream> 
#include <type_traits> 
#include <tuple> 

int main() { 
    auto tup = std::make_tuple(1, 2); 
    auto [ a, b ] = tup; 
    decltype(auto) e = a; 
    std::cout << std::boolalpha << std::is_reference_v<decltype(e)> << std::endl; 
} 

clang(輸出:false)和gcc(輸出:true)在這個簡單的例子不同意。考慮到例如this Q&Ase應該是一個參考或是一個海灣合作委員會的錯誤?或者,也許代碼是不合格的?

回答

17

標識自己是參考文獻。從[dcl.struct.bind]/3

鑑於類型T 指定由std​::​tuple_­element<i, E>​::​type,每個V 是類型的變量「到T參考」與初始化,其中,所述參考是一個左值引用初始化如果初始值是一個左值和一個右值引用,否則;引用的類型是T i

也就是說,ab都是int&&

但方式decltype(auto)實際上表現爲來自[dcl.type.auto.deduct]

如果佔位符是decltype(auto)類型說明符,T應占位符孤單。推導出的T的類型按照[dcl.type.simple]中的描述確定,好像e已經成爲decltype的操作數。

這一措詞是好不尷尬,但最終:

decltype(auto) e = a; 
~~~~~~~~~~~~~~ 

表示:

decltype(a ) e = a; 
     ~~~~ 

decltype(a)手段,從[dcl.type.simple]/4.1

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

引用的類型的aint,所以e必須是int。這意味着它不是一個參考,鏗鏘是正確的。提起81176

相關問題