क्या यह कोड मान्य सी ++ (11) है?एकाधिक विरासत द्वारा छिपाई गई श्रेणी
struct Base {
template <typename>
struct nested;
};
struct Derived1 : Base { };
struct Derived2 : Base { };
struct Derived3 : Derived1, Derived2 { };
typedef Derived3::nested<int> xxx;
मैं
ऊपर कोड के साथ संकलित करने के लिए विफल रहता है क्या जानते हैं:
- एप्पल LLVM 5.0 (बजना-500.2.75)
- बजना 3,4
लेकिन यह सफलतापूर्वक संकलित करता है:
- जीसीसी 4.9.0 20,131,110 (प्रायोगिक)
- जीसीसी 4,8
इसके अलावा, अगर मैं एक गैर टेम्पलेट प्रकार के nested
प्रकार, यानी
struct Base {
struct nested;
};
...
typedef Derived3::nested xxx;
बदल तो यह काम करता है उपरोक्त कंपाइलर्स के साथ।
[संपादित करें] एक टेम्पलेट उर्फ करने के लिए nested
टेम्पलेट struct परिवर्तित करने से कुछ भी नहीं बदलता है;
template <typename> struct dependent { struct type; };
struct Base {
template <typename T>
using nested = typename dependent<T>::type;
};
उपरोक्त कंपाइलरों के साथ एक ही परिणाम उत्पन्न करता है। [अंत संपादित करें]
N3242 से §10.1 [class.mi]
एक वर्ग एक अप्रत्यक्ष आधार वर्ग एक बार से अधिक हो सकता है और एक सीधा और एक अप्रत्यक्ष आधार वर्ग हो सकता है। ऐसी चीजें हैं जो ऐसी कक्षा के साथ की जा सकती हैं। गैर-स्थैतिक डेटा सदस्यों और प्रत्यक्ष आधार वर्ग के सदस्य कार्यों को व्युत्पन्न वर्ग के दायरे में संदर्भित नहीं किया जा सकता है। हालांकि, स्थैतिक सदस्यों, गणनाओं और प्रकारों को स्पष्ट रूप से संदर्भित किया जा सकता है।
मुझे लगता है कि इसका मतलब है कि कोड मान्य होना चाहिए, लेकिन मुझे यकीन है कि नहीं हूँ।
मैंने ओपी द्वारा भरे [बग रिपोर्ट] (https://bugs.llvm.org/show_bug.cgi?id=17929) (आईडी 17 9 2 9) की तलाश की क्योंकि बग (?) अभी भी क्लैंग 5.0 में दिखता है .1। दुर्भाग्य से, कोई जवाब नहीं मिला है। – Caninonos