2010-10-09 20 views
11

ISO/IEC 14882, Programming language – C++ के व्यापक पढ़ने के बाद मुझे क्यों const निम्नलिखितनिहित रूपांतरण के लिए क्यों आधार है?

#include <iostream> 

class X { 
public: 
    X(int value) { 
     printf("constructor initialized with %i",value); 
    } 
} 

void implicit_conversion_func(const X& value) { 
    //produces "constructor initialized with 99" 
} 

int main (int argc, char * const argv[]) { 
    implicit_conversion_func(99); 
} 



की तरह एक भी तर्क निर्माता के साथ एक उपयोगकर्ता-निर्धारित प्रकार के निहित रूपांतरण के लिए आवश्यक है के साथ खंड 4 लाइन शुरू अभी भी अनिश्चित हूँ 3

एक अभिव्यक्ति ई को पूरी तरह से एक प्रकार टी में परिवर्तित किया जा सकता है यदि केवल घोषणा अगर टी टी = ई; कुछ आविष्कारित अस्थायी परिवर्तनीय टी (8.5) के लिए अच्छी तरह से गठित है। कुछ भाषा संरचनाओं की आवश्यकता होती है कि एक अभिव्यक्ति को बूलियन मान में परिवर्तित किया जाए। इस तरह के संदर्भ में प्रकट होने वाली एक अभिव्यक्ति को संदर्भित रूप से बूल में परिवर्तित किया जाता है और अगर यह घोषणा केवल तभी होती है जब घोषणा बूल टी (ई); कुछ आविष्कारित अस्थायी परिवर्तनीय टी (8.5) के लिए अच्छी तरह से गठित है। या तो अंतर्निहित रूपांतरण का प्रभाव घोषणा और प्रारंभिक प्रदर्शन के रूप में और फिर रूपांतरण के परिणामस्वरूप अस्थायी चर का उपयोग करना जैसा ही है। परिणाम एक अंतराल है यदि टी एक lvalue संदर्भ प्रकार (8.3.2) है, और अन्यथा एक rvalue है। अभिव्यक्ति ई को एक लाभा के रूप में प्रयोग किया जाता है यदि केवल प्रारंभिकता इसे एक लाभा के रूप में उपयोग करती है।

है कि मैं एक कार्यक्रम एक स्थिरांक योग्य प्रकार टी, टी की एक वस्तु के डिफ़ॉल्ट प्रारंभ के लिए कहता है, तो 8.5 लाइन 6

में उपयोगकर्ता-निर्धारित प्रकार से संबंधित initializers पर अनुभाग पाया के बाद एक उपयोगकर्ता द्वारा प्रदान किए गए डिफ़ॉल्ट कन्स्ट्रक्टर के साथ एक वर्ग प्रकार होगा।

अंत में मैं 12.3 उपयोगकर्ता परिभाषित रूपांतरण के बारे में लाइन 2 जिसमें कहा गया है

उपयोगकर्ता-परिभाषित रूपांतरण लागू होते हैं केवल जहां वे स्पष्ट (10.2, 12.3.2) कर रहे हैं पर समाप्त हो गया।

कहने की जरूरत नहीं है, 10.2 और 12.3.2 ने मेरे प्रश्न का उत्तर नहीं दिया।

  1. कोई क्या प्रभाव const अंतर्निहित रूपांतरण पर है पर कुछ प्रकाश डाला सकता है?
  2. क्या const का उपयोग 12.3 लाइन 2 प्रति "असंबद्ध" रूपांतरण करता है?
  3. const किसी भी तरह से खंड 4 बनाम लालू बनाम रावलू को प्रभावित करता है?
+1

क्या आपको बस सी ++ पसंद नहीं है? –

उत्तर

13

यह निहित रूपांतरण के साथ वास्तव में बहुत कुछ नहीं है। इसके अलावा, रूपांतरण के साथ वास्तव में बहुत कुछ नहीं करना है। यह वास्तव में रैल्यू बनाम lvalues ​​ है।

जब आप 99 को X टाइप करने के लिए कनवर्ट करते हैं, तो परिणाम रावल्यू है। रूपांतरणों के सी ++ परिणामों में हमेशा राजस्व होते हैं (जब तक आप संदर्भ प्रकार में परिवर्तित नहीं होते)। सी ++ में गैर-कॉन्स संदर्भों को राजस्व के लिए संलग्न करना गैरकानूनी है।

उदाहरण के लिए, इस कोड को

X& r = X(99); // ERROR 

संकलन नहीं होगा क्योंकि यह एक rvalue करने के लिए एक गैर स्थिरांक संदर्भ संलग्न करने के लिए प्रयास करता है। दूसरी ओर, इस कोड को ठीक

const X& cr = X(99); // OK 

क्योंकि यह पूरी तरह से एक rvalue करने के लिए एक स्थिरांक संदर्भ संलग्न करने के लिए ठीक है।

वही बात आपके कोड में भी होती है। तथ्य यह है कि इसमें एक अंतर्निहित रूपांतरण शामिल है, इस बिंदु के बगल में है। const बिना ऐसा नहीं होता, const के साथ संकलित: आप एक स्पष्ट एक

implicit_conversion_func(X(99)); 

साथ अंतर्निहित रूपांतरण की जगह और एक ही स्थिति के साथ खत्म हो सकता है।

फिर, रूपांतरण (स्पष्ट या निहित) यहां एकमात्र भूमिका निभाती है कि यह हमें एक रैल्यू बनाने में मदद करता है। सामान्य तौर पर, आप किसी अन्य तरीके से एक rvalue उत्पादन और एक ही मुद्दा

int &ir = 3 + 2; // ERROR 
const int &cir = 3 + 2; // OK 
+0

"_ जब आप 99 को टाइप करने के लिए एक्स को कनवर्ट करते हैं, तो परिणाम एक रावल्यू है ._" नहीं ** एक रैल्यू एक अभिव्यक्ति है। ** '99' से' एक्स' को अस्थायी ऑब्जेक्ट में कनवर्ट करना। – curiousguy

+0

@curiousguy: जबकि "रावल्यू" की अवधारणा दृढ़ता से अभिव्यक्ति से जुड़ी हुई है, शब्द "रावल्यू" का प्रयोग अभिव्यक्ति को संदर्भित करने के साथ-साथ परिणामस्वरूप उत्पन्न होने के लिए भी किया जा सकता है। भाषा मानक वास्तव में "रावल्यू एक्सप्रेशन" की तुलना में "रावल्यू परिणाम" की अवधारणा का उपयोग करता है। (जाहिर है, दोनों वास्तव में एक ही बात का उल्लेख करने के इरादे से हैं)। इसके अलावा, भाषा विनिर्देश 5.2.3 में स्पष्ट रूप से और स्पष्ट रूप से बताता है कि कार्यात्मक-शैली के मामले का परिणाम एक रैल्यू है। अवधि। तथ्य यह है कि यह "अस्थायी वस्तु" भी होता है, यहां शायद ही प्रासंगिक है। – AnT

+0

क्या आप कृपया बता सकते हैं कि "रावल्यू" का क्या अर्थ है? – curiousguy

0

खंड 5.2.2 अनुच्छेद 5 के अनुसार, एक समारोह के लिए एक तर्क const संदर्भ प्रकार की है जब में चला सकते हैं, एक अस्थायी चर स्वचालित रूप से है यदि आवश्यक हो तो पेश किया गया। आपके उदाहरण में, X(99) के रावलू परिणाम को अस्थायी चर में रखा जाना चाहिए ताकि वह चर constimplicit_conversion_func के संदर्भ में पारित किया जा सके।

+0

"_ रावल्यू 99 को अस्थायी चर में रखा जाना चाहिए ताकि एक्सएक्स को एक्स_ के कन्स्ट्रक्टर के संदर्भ में (कॉन्स) संदर्भ दिया जा सके। नहीं। कन्स्ट्रक्टर का पैरामीटर मूल्य से गुजरता है; 'int' का निरंतर संदर्भ नहीं है, और मूल्य 99 के साथ कोई अस्थायी नहीं है।" _ गैर-कॉन्स अस्थायी बनाने का अर्थशास्त्र किसी भी मामले में भ्रमित करने वाला होगा "std :: string() =" हैलो, दुनिया "'? – curiousguy

+0

@curiousguy अच्छा बिंदु - मुझे लगता है कि मैं ओपी को गलत तरीके से पढ़ता हूं। अस्थायी ''const'' को '99' के साथ तर्क के रूप में शुरू करके प्रारंभ किया गया है, न कि' const int '। इसके बारे में जानकारी बनी हुई है, हालांकि: 'const '' अस्थायीता को' कॉन्स्ट एंड 'तर्क को पूरा करने के लिए बनाया गया है। –

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