2017-08-06 17 views
18

मुझे समझ नहीं आता क्यों निम्नलिखित कोड जीसीसी 8.0 पर संकलित है:यह रावल्यू संदर्भ एक लालसा से क्यों बंधे हैं?

decltype(auto) foo(int&& r) { 
    return r; 
} 

foo में, r की घोषणा प्रकार int&& है, और इसलिए foo की वापसी प्रकार भी int&& है। लेकिन r स्वयं एक लालसा है, और एक लालसा एक रैल्यू संदर्भ से बंधे नहीं जा सकता है।

क्या मुझे कुछ याद आ रही है?

+0

[gcc8] (https://wandbox.org/permlink/4CSGrHnZ26nGL8QK) के साथ पुन: उत्पादित, ऐसा लगता है कि जीसीसी 8 ने रिटर्न प्रकार को 'int' 'के रूप में घटाया। – songyuanyao

+0

@songyuanyao वे कोड संकलन का दावा करते हैं, ताकि कोई repro नहीं होगा। –

+1

@BamititAugen निश्चित कोड [gcc8] (https://wandbox.org/permlink/7mUFIa2VVAwgprEM) ​​के साथ संकलित करता है, लेकिन नहीं [clang6] (https://wandbox.org/permlink/3lpIoyciSWUisYh7)। – songyuanyao

उत्तर

14

[dcl.spec.auto]/5 के अनुसार, वापसी का प्रकार घटाया जाता है जैसे return कथन का ऑपरेंड decltype का संचालन था। और [dcl.type.simple]/(4.2) स्पष्ट रूप से बताता है कि, जैसा कि ऑपरेंड को संश्लेषित नहीं किया जाता है, इकाई का प्रकार decltype द्वारा उत्पन्न प्रकार है, यानी int&& है। और वास्तव में, r एक लाभा ([expr.prim.id.unqual]) है।

सौभाग्य से, यह दो साल पहले bug 64892 के रूप में खोज और दायर किया गया है। (मुझे आश्चर्य है कि इसे ठीक करने का कोई समय क्यों नहीं मिला?)

संबंधित मुद्दे