2016-08-20 8 views
16

मैं पूछना चाहता था कि क्यों as_const रैल्यू तर्कों को रोकता है, according to cppreference.com (यानी मानक लोगों ने इसे क्यों बनाया, क्यों नहीं cppreference.com ने उन्हें विशेष रूप से उद्धृत किया। और यह भी नहीं कि समिति का इरादा कहां है कोडिफाइड, बस सुनिश्चित करने के लिए :)))। यह (कृत्रिम) उदाहरण एक त्रुटि प्राप्त होते हैंas_const रावल तर्कों को क्यों रोकता है?

QChar c = as_const(getQString())[0]; 

Another question's answer नोटों कि अगर हम सिर्फ rvalue संदर्भ अधिभार का विलोपन हटाने , यह चुपचाप rvalues ​​परिणत हो गया (उपयोगकर्ता गाय चुप करने के लिए यह स्थिरांक बनाना चाहता है) lvalues ​​करने के लिए। ठीक है, लेकिन रावल्यू इनपुट के लिए रावल्यू इनपुट और कॉन्स लाइवल्स के लिए राक्षसों को शानदार तरीके से क्यों न करें और कॉन्स रावलस क्यों न करें?

+0

धन्यवाद, हाँ यह एक डुप्ली है। ASAP –

+0

आह बंद करना, मैं वहां दिए गए उत्तर से संतुष्ट नहीं हूं .. फिर से खोलना! कृपया –

+0

प्रश्न से जुड़े मेरे नोट्स को ढूंढें, ऐसा क्यों नहीं है http://stackoverflow.com/a/9453435/34509 .. मुझे तब कोई तत्काल खतरा नहीं देखा गया था। –

उत्तर

5

एक कारण यह हो सकता है कि यह स्वामित्व हस्तांतरण

for (auto const &&value : as_const(getQString())) // whoops! 
{ 
} 

की कमी के कारण और है कि एक सम्मोहक उपयोग के मामले इस संभावना की अनदेखी करने का औचित्य साबित करने नहीं हो सकता है rvalues ​​पर खतरनाक हो सकता है।

+0

एचएम, जो खतरे का एक आकर्षक उदाहरण पेश करता है! धन्यवाद। इसे राजस्व के लिए काम करना इतना उपयोगी होगा, लेकिन मैं समझ सकता हूं कि वे नहीं चाहते कि लोग इस जाल में चले जाएं। अब मैं देखता हूं कि 'std :: cref' को रैवल्यू तर्कों के लिए भी हटा दिया गया है, शायद इसके साथ समरूपता एक और तर्क था? –

+0

@ जोहान्सचैब-लिटब: ठीक है, यकीन है, लेकिन शायद यह कारण और प्रभाव पीछे की ओर हो रहा है ... मुझे कल्पना है कि शायद इसी कारण से भी था। – Mehrdad

+0

"स्वामित्व हस्तांतरण की कमी", इसका क्या अर्थ है? मुझे लगता है कि 'क्यूस्ट्रिंग' भंगुर अर्थशास्त्र के साथ गाय कार्यान्वयन है जहां गैर-'const' आइटम पहुंच निवारक प्रतिलिपि उत्पन्न करती है और 'const' पहुंच नहीं देता है लेकिन संदर्भ देता है (यह बहुत असुरक्षित, मैला डिजाइन है, लेकिन मैं इसे मान रहा हूं)। मैं अभी भी नहीं देख सकता कि यह उदाहरण क्या है। मैं कल्पना कर सकता हूं कि जो भी 'मूल्य' संदर्भित करता है, स्ट्रिंग के बफर में एक अस्थायी या कोई आइटम, और यह कि सूचक बहुत तेजी से लटकता है। लेकिन 'as_const' के साथ ऐसा करने के लिए कुछ भी नहीं है। या यह है? –

-2

क्योंकि as_const तर्क को कॉन्स्ट संदर्भ के रूप में नहीं लेता है। गैर-कॉन्स लैवल्यू संदर्भ अस्थायी से बंधे नहीं जा सकते हैं।

अग्रेषण संदर्भ अधिभार स्पष्ट रूप से हटा दिया गया है।

6

समस्या जीवन विस्तार को संभालने के लिए

const auto& s = as_const(getQString()); // Create dangling pointer 
QChar c = s[0]; // UB :-/ 

एक संभावना निम्नलिखित अधिभार होगा (नष्ट एक के बजाय)

template< typename T > 
const T as_const(T&& t) noexcept(noexcept(T(t))) 
{ 
    return t; 
} 

जो अतिरिक्त निर्माण शामिल है, और शायद अन्य नुकसान है।

+0

'as_const_ref' के जोहान्स का सुझाव इस से निपटेंगे, है ना? फिर कोई जीवनभर विस्तार की उम्मीद नहीं करेगा। –

+0

@ चीयर्संधथ.-आल्फ़: जैसा कि मेरी चिंता आजीवन विस्तार है, वास्तव में, यदि हम बिना जीवन के विस्तार की आवश्यकता के मामलों के साथ रहते हैं, तो 'as_const_ref' अच्छा लगता है। – Jarod42

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