6
#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(const Y&) { cout << "converting constructor" << endl; } 
}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
} 

रूपांतरण समारोह ऊपर में, मेरा संकलक (जीसीसी 4.6.1) द्वारा निर्माता परिवर्तित करने को प्राथमिकता दी गई है लेकिन मानक में यह कहा गया है कि:सी ++ 11: पास-बाय-वैल्यू पैरामीटर के आरंभ में कन्स्ट्रक्टर और रूपांतरण फ़ंक्शन को कनवर्ट करने के बीच अस्पष्टता?

User-defined conversions are applied only where they are unambiguous

यह प्रतीत होता है कि इस मामले में अस्पष्टता है। क्या कोई विरोधाभास समझा सकता है?

मुझे उपरोक्त संकलन करने की उम्मीद नहीं होगी। मुझे यह भी यकीन है कि साल पहले स्कॉट मेयर्स ने इस विशिष्ट उदाहरण के बारे में लिखा था और कहा था कि यह संकलित नहीं होगा। मैं क्या खो रहा हूँ?

उत्तर

5

क्योंकि एक्स निर्माता एक const तर्क चाहता है, यह ऑपरेटर पसंद करती हैं। यदि आप एक्स कन्स्ट्रक्टर में const हटाते हैं तो संकलक अस्पष्टता के बारे में शिकायत करता है। यदि संदर्भ पैरामीटर के साथ एक से अधिक फ़ंक्शंस हैं, तो सबसे अधिक आराम वाले कॉन्स योग्यता वाले व्यक्ति को प्राथमिकता दी जाती है।

एक अच्छा जवाब here

1

यहाँ कोई अस्पष्टता नहीं है, केवल वैध रूपांतरण रूपांतरण समारोह द्वारा प्रदान की जाती है।
ध्यान दें कि y है नहीं एक const, अपने रूपांतरण निर्माता एक const तर्क की जरूरत है।

एक अस्पष्टता होगी, यदि आपके रूपांतरण निर्माता ने एक गैर कॉन्स्ट संदर्भ लिया है।

Online Sample:

#include <iostream> 
using namespace std; 

struct Y; 

struct X 
{ 
    X(Y&) { cout << "converting constructor" << endl; } 

}; 

struct Y 
{ 
    operator X() { cout << "conversion function" << endl; } 
}; 

void f(X x) {} 

int main() 
{ 
    Y y; 
    f(y); 
    return 0; 
} 

आउटपुट:

prog.cpp: In member function ‘Y::operator X()’:
prog.cpp:13: warning: no return statement in function returning non-void
prog.cpp: In function ‘int main()’:
prog.cpp:21: error: conversion from ‘Y’ to ‘X’ is ambiguous
prog.cpp:13: note: candidates are: Y::operator X()
prog.cpp:8: note: X::X(Y&)

+0

Btw, वहाँ कुछ भी नहीं C++ 11 कोड sample.The कोड में विशिष्ट है भी C++ 03 में मान्य है। –

+0

इसे डाउनवॉटिंग का कारण क्या है? जब आप इंगित करने के लिए आप क्या महसूस गलत है और अगर आप downvote को न्यायोचित ठहरा के लिए किसी भी तार्किक/तकनीकी कारणों से नहीं सोच सकते हैं, अपने आप को downvoting के लिए योग्य नहीं पर विचार करें downvote कारणों का उल्लेख करें। –

+0

मुझे खेद है। मैंने सोचा कि जिस कारण से मैंने इसे कम किया है, वह पहले ही स्वीकार किए गए उत्तर में दिया गया है। कन्स्ट्रक्टर * * रूपांतरण द्वारा उपयोग किया जा सकता है। लेकिन यह पसंद नहीं है। –

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