MSVC में संभावित कंपाइलर बग


13

निम्नलिखित कोड gcc और clang (और कई अन्य C ++ 11 संकलक) के साथ संकलित करता है

#include <stdint.h>

typedef int datatype;

template <typename T>
struct to_datatype {};

template <>
struct to_datatype<int16_t> {
  static constexpr datatype value = 1;
};

template <typename T>
class data {
 public:
  data(datatype dt = to_datatype<T>::value) {}
};

int main() {
  data<char> d{to_datatype<int16_t>::value};
}

जब (लगभग) नवीनतम MSVC के साथ संकलन

> cl .\test.cpp /std:c++latest /permissive-
Microsoft (R) C/C++ Optimizing Compiler Version 19.24.28314 for x64
Copyright (C) Microsoft Corporation.  All rights reserved.

test.cpp
.\test.cpp(16): error C2039: 'value': is not a member of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(16): note: see declaration of 'to_datatype<T>'
        with
        [
            T=char
        ]
.\test.cpp(20): note: see reference to class template instantiation 'data<char>' being compiled

क्या यह MSVC का बग है? यदि हाँ, तो C ++ मानक में कौन सा शब्द सबसे अच्छा वर्णन करता है?

यदि आप कोड का हिस्सा बदल देते हैं

template <typename T>
class data {
 public:
  data(datatype dt) {}
  data() : data(to_datatype<T>::value) {}
};

यह वैसे भी आसानी से संकलन करता है।


यह वन-लाइनर अंतरों की व्याख्या कर सकता है। देखें कि आपके कंपाइलर किस लिए वापस आते हैं std::is_same_v<char, int8_t>। मेरा अनुमान यह होगा कि इसे लागू करना परिभाषित है कि क्या int8_t char के समान है, लेकिन किसी को प्रलेखन की जांच करने की आवश्यकता होगी।
17

ऐसा लगता है कि यह वास्तव में एक बग हो सकता है। यह मुद्दा हाल ही में खोला गया था और कई अन्य रिपोर्टें आई हैं।
पूर्वकाल

1
@alteredinstance मैं यह नहीं देखता कि यह मुद्दा इस प्रश्न से कैसे संबंधित है, या आपका पिछला लिंक उस मामले के लिए कैसा है। क्या आपने इस त्रुटि संदेश के लिए Google द्वारा दिए गए पहले लिंक को कॉपी किया था? त्रुटि संदेश बहुत सामान्य है और कई अलग-अलग (वैध) स्थितियों में दिखाई दे सकता है।
अखरोट

अंक में उल्लिखित कोड की @walnut रेखा 231 में समग्र आरंभ के साथ MSVC मुद्दे के लिए एक विवादास्पद लिंक है, वही ओपी कोड कर रहा है। यह सिर्फ इतना होता है कि बूस्ट लाइब्रेरी हाल ही में valueMSVC के साथ एक समग्र प्रकार में उपयोग करने के साथ एक समान मुद्दे पर चला गया है
परिवर्तन

1
और एक नई बग रिपोर्ट: developercommunity.visualstudio.com/content/problem/871304/…
marcinj

जवाबों:


8

मैं कहूंगा कि MSVC कोड को स्वीकार नहीं करने के लिए गलत है।

के अनुसार [dcl.fct.default] / 5 सी ++ 17 मानक अंतिम मसौदा की, एक वर्ग टेम्पलेट के एक सदस्य समारोह के डिफ़ॉल्ट बहस में देखने का नाम [temp.inst] में नियमों के अनुसार किया जाता है।

[Temp.inst] / 2 के अनुसार एक वर्ग टेम्पलेट के अंतर्निहित तात्कालिकता के कारण सदस्य कार्यों के डिफ़ॉल्ट तर्कों की तात्कालिकता नहीं होती है और [temp.inst] के अनुसार / 4 एक सदस्य के फ़ंक्शन के लिए एक डिफ़ॉल्ट तर्क (गैर-स्पष्ट विशेषज्ञता) a) क्लास टेम्पलेट का उपयोग तब किया जाता है जब वह कॉल द्वारा उपयोग किया जाता है।

to_datatype<T>::valueआपके कोड में डिफ़ॉल्ट तर्क का उपयोग करते हुए कोई कॉल नहीं है और इसलिए इसे तत्काल नहीं किया जाना चाहिए। इसलिए असफल होने की सूरत valueमें कोई त्रुटि नहीं होनी चाहिए to_datatype<char>

(सी ++ 11 मानक अंतिम ड्राफ्ट में संबंधित अनुभागों में क्रमांकन के अलावा, समकक्ष शब्द हैं, [[.ctct.default] / 5 , [temp.inst] / 1 और [temp.inst] / 3 के बजाय देखें।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.