c++ - विजुअल स्टूडियो सी++ कंपाइलर अजीब व्यवहार




visual-studio-2012 most-vexing-parse (2)

मैं जानना चाहता हूं कि दृश्य स्टूडियो में कोड का यह छोटा टुकड़ा सही तरीके से (और बिना चेतावनी के) क्यों संकलित करता है। शायद परिणाम GCC और Clang साथ समान है, लेकिन दुर्भाग्यवश मैं अब उनका परीक्षण नहीं कर सकता।

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    return 0;
}

क्योंकि यह प्रकार के एक चर को परिभाषित करता है टी:

http://coliru.stacked-crooked.com/a/d420870b1a6490d7

#include <iostream>

struct T {
    int t;
    T() : t(0) {}
};

int main() {
    T(i_do_not_exist);
    i_do_not_exist.t = 120;
    std::cout << i_do_not_exist.t;
    return 0;
}

उपरोक्त उदाहरण मूर्खतापूर्ण दिखता है, लेकिन इस वाक्यविन्यास को किसी कारण से अनुमति है।

एक बेहतर उदाहरण है:

int func1();
namespace A
{
   void func1(int);
   struct X {
       friend int (::func1)();
   };
}

शायद अन्य उदाहरण मिल सकते हैं।


T(i_do_not_exist); T i_do_not_exist; के समान अर्थ के साथ एक ऑब्जेक्ट घोषणा है T i_do_not_exist;

N4567 § 6.8 [stmt.ambig] पी 1

अभिव्यक्ति-कथन और घोषणाओं वाले व्याकरण में एक अस्पष्टता है: एक फ़ंक्शन-स्टाइल स्पष्ट प्रकार रूपांतरण (5.2.3) के साथ एक अभिव्यक्ति-कथन , जो इसके बाएं सबएक्सप्रेस के रूप में घोषित किया जा सकता है, जहां घोषणाकर्ता एक प्रारंभिक घोषणाकर्ता से शुरू हो सकता है ( उन मामलों में बयान एक घोषणा है

§ 8.3 [dcl.meaning] पी 6

घोषणा में TD जहां D के रूप में है

( D1 )

निहित घोषणाकर्ता-आईडी का प्रकार घोषणा में निहित घोषणाकर्ता-आईडी के समान है

T D1

अभिभावक एम्बेडेड घोषणाकर्ता-आईडी के प्रकार को परिवर्तित नहीं करते हैं, लेकिन वे जटिल घोषणाकर्ताओं के बाध्यकारी को बदल सकते हैं।





most-vexing-parse