c++ विजुअल स्टूडियो 2013 'स्पष्ट' कीवर्ड बग?




visual-studio-2013 explicit-conversion (2)

निम्नलिखित कार्यक्रम पर विचार करें:

#include <iostream>

class A
{
public:
  A( ) { std::cout << "A()\n"; }

  A( A& ) = delete;

  A( int i ) { std::cout << "A( " << i << " )\n"; }

  explicit operator int( ) { std::cout << "operator int()\n"; return 42; }
};

template< typename T = A > void f( T a = A() ) {}

int main( void )
{
  f();
  return 0;
}

विजुअल स्टूडियो 2013 इस कोड को संकलित करता है और आउटपुट के साथ चलता है

A()
operator int()
A( 42 )

क्या यह एक कंपाइलर बग है? ऐसा लगता है कि वीएस कंपाइलर इस संदर्भ में 'स्पष्ट' कीवर्ड पर ध्यान नहीं देता है। मेरी समझ से, वीएस 2013 गलत रूप से ऑपरेटर int () को ए (int) के साथ संयोजन में 'कॉपी-निर्माण' ए को क्रमबद्ध करने के लिए गलत पैरामीटर के रूप में उपयोग करता है।

दोनों जोड़ना

A a;
A a1( a );

मुख्य और घोषित करने के लिए एफ

void f( A a = A() ) {}

संकलित नहीं करता है, वीएस शिकायत करता है कि ए (ए और) हटा दिया गया है, जो सही व्यवहार प्रतीत होता है। केवल फ़ंक्शन टेम्पलेट डिफ़ॉल्ट पैरामीटर के संदर्भ में ऑपरेटर int () और ए (int) का संयोजन ए (ए और) के प्रतिस्थापन के रूप में काम करता प्रतीत होता है।

जी ++ 4.7.3 कोड संकलित नहीं करता है और शिकायत करता है:

main.cpp: In function ‘int main()’:
main.cpp:21:7: error: no matching function for call to ‘A::A(A)’
main.cpp:21:7: note: candidates are:
main.cpp:10:3: note: A::A(int)
main.cpp:10:3: note:   no known conversion for argument 1 from ‘A’ to ‘int’
main.cpp:6:3: note: A::A()
main.cpp:6:3: note:   candidate expects 0 arguments, 1 provided

'स्पष्ट' को हटाने से g ++ कोड संकलित करता है और आउटपुट समान होता है।


यह निश्चित रूप से विजुअल सी ++ में एक बग है। मानक के अनुसार:

12.3.2 रूपांतरण कार्य [class.conv.fct]

2 - एक रूपांतरण फ़ंक्शन स्पष्ट हो सकता है (7.1.2), इस मामले में इसे केवल कुछ संदर्भों में प्रत्यक्ष-प्रारंभिक (8.5) के लिए उपयोगकर्ता द्वारा परिभाषित रूपांतरण के रूप में माना जाता है (13.3.1.4, 13.3.1.5, 13.3.1.6) ।

और आपके उदाहरण में कोई प्रत्यक्ष-प्रारंभिकता नहीं है।

जीसीसी और क्लैंग जैसे अन्य सी ++ कंपाइलर्स इस मामले में एक त्रुटि की रिपोर्ट करते हैं।






explicit-conversion