क्या निम्न कोड C++ में अच्छी तरह परिभाषित है? (*)अपूर्ण प्रकार के डेटा सदस्य को सूचक
मुझे यह पता लगाने में कठिनाई हो रही है कि मानक में भी कहां देखना है, और वेब पर खोज करना कुछ ठोस नहीं है।
struct S;
struct T {
constexpr T() = default;
bool S::* a = nullptr;
int b = 42;
};
const T t{};
// Test. Compiled using: cl /W4 /WX /FAs filename.cpp
#include <stdlib.h>
int main() {
if (t.b != 42) abort();
}
कारण मैं पूछ रहा हूँ क्योंकि यह काम करता है (या लगता है) जीसीसी और बजना (x86/x86_64) के नए संस्करण के साथ है, लेकिन विफल रहता है (**) विजुअल स्टूडियो 2015 के साथ है अद्यतन 2 और 3 को अपडेट करें आर सी।
एक बग की रिपोर्ट करने से पहले मैं यह सुनिश्चित करना चाहता हूं कि मैं अपरिभाषित व्यवहार पर निर्भर नहीं हूं या सिर्फ सही शर्तों की खोज नहीं कर रहा हूं।
मैंने /vmg
और /vmb
का उपयोग करने का भी प्रयास किया है जैसा कि this post में उल्लिखित है।
(*): मुझे ज्यादातर सी ++ 14 और बाद में परवाह है, लेकिन मुझे कोई कारण नहीं दिख रहा है कि उत्तर सी ++ 11 पर लागू नहीं होना चाहिए।
(**): यदि कोड अच्छी तरह से परिभाषित किया गया है तो यह एक कोडेजन बग जैसा दिखता है जहां यह सूचक के लिए आवंटन कक्ष नहीं है। struct S
से struct S{}
को बदलकर कोड "काम" लगता है।
आप कोड को क्या करने की उम्मीद कर रहे हैं? क्या 'टी' में 'एस' के लिए एक सूचक होना चाहिए, और यदि हां, तो यह क्यों नहीं लिखा गया है 'एस * ए = नलप्टर;'? – Xirema
संकलित [यहां] (http://rextester.com/NFYP31324) और अपने स्वयं के एमएसवीएस 2015 पर। मेरे पास संस्करण 14.0.23107.0 डी 14REL – NathanOliver
@Xirema: 'T :: a' एक [boolter a (bool) डेटा है सदस्य] (http://en.cppreference.com/w/cpp/language/pointer#Pointers_to_data_members) अपूर्ण प्रकार 'S' में। @NathanOliver: यह मेरे लिए भी संकलित करता है, लेकिन इसे निष्पादित करते समय 'abort'। – user786653