2015-01-22 18 views
8

पर संशोधक की अनुमति नहीं है मैंने लिनक्स के तहत सिग्नल/स्लॉट लाइब्रेरी (Codeproject article here) लिखा है, जो क्लैंग 3.5 और जीसीसी 4.9 दोनों के साथ संकलित है। यह दोनों कंपाइलरों पर चेतावनियों के बिना संकलित करता है (संस्करण 3.4 resp4 4 संस्करणों पर भी)। जब मुझे यह सब काम मिल गया, और लेख ऑनलाइन पोस्ट किया गया, तब तक यह लंबे समय तक नहीं था जब तक मुझे शिकायत नहीं मिली कि यह एमएसवीसी पर काम नहीं कर रहा है। (विजुअल स्टूडियो एक्सप्रेस 2013? मुझे खेद है, मैं वर्जनिंग सिस्टम से परिचित नहीं हूं।) मैंने इसे स्वयं के लिए देखने के लिए एक वीएम में स्थापित किया और पाया कि यह निम्नलिखित संकलित नहीं करेगा:एमएसवीसी: गैर-सदस्य समारोह

template <typename Signature> 
struct RemoveCV; 

template <typename R, typename ... Args> 
struct RemoveCV<T, R (Args...)> 
{ 
    using Type = R(Args...); 
}; 

template <typename R, typename ... Args> 
struct RemoveCV<T, R(Args...) const> 
{ 
    using Type = R(Args...); 
}; 

// more specializations for volatile and const volatile 

// Usage: 
template <typename Signature_> 
struct Function 
{ 
    using Signature = RemoveCV<Signature_>::Type; 
}; 

// both Function<void()> and Function<void() const> now have 
// the same Signature: void() 

कारण यह है कि R(Args ...) कोई सदस्य फ़ंक्शन नहीं है, इसलिए इसमें const क्वालीफायर नहीं हो सकता है।

हालांकि यह निश्चित रूप से सच है कि गैर-सदस्य समारोह पर const क्वालीफायर होने का अर्थ नहीं है, मुझे विश्वास है कि मैंने कहीं पढ़ा है (यहां एसओ पर, मानक से उद्धरण सहित), यह अनुमति है जब तक यह एक वास्तविक कार्य के लिए बाध्य नहीं है। अर्थात। यह एक स्टैंड-अलोन प्रकार के रूप में अनुमति है। दुर्भाग्य से मैं अब उस धागे को खोजने में सक्षम नहीं लग रहा हूं ...

मैं सोच रहा था कि इस अवसर पर कौन सही है: एमएसवीसी या जीसीसी + क्लैंग, और मानक स्टैंडअलोन फ़ंक्शन हस्ताक्षर के बारे में क्या कहना है void() const

+0

आपको ऐसी चीज़ की आवश्यकता क्यों है? –

+0

@ एन.एम. लचीलापन के लिए। मैं त्रुटि संदेश उत्पन्न नहीं करना चाहता हूं जब मेरी लाइब्रेरी के उपयोगकर्ता सिग्नल 'के बजाय 'सिग्नल ' निर्दिष्ट करते हैं। लेकिन मुझे लगता है कि आपके प्रश्न का असली जवाब यह होगा कि मुझे इसकी आवश्यकता नहीं है। – JorenHeit

उत्तर

5

ठीक है, मुझे विश्वास है कि ऐसा लगता है कि ऐसा लगता है कि आप (और जीसीसी और क्लैंग) सही हैं, मानक के अनुसार क्या है।

:

एक सीवी-क्वालीफायर-सेक या एक रेफरी-क्वालीफायर का हिस्सा केवल होगी: §8.3.5/6 (N3376 में), (जोर मेरा) से

- एक गैर स्थिर सदस्य समारोह के लिए समारोह का प्रकार,

- समारोह प्रकार है जो करने के लिए सदस्य के लिए एक सूचक संदर्भित करता है,

- एक समारोह typedef घोषणा या उर्फ-घोषणा के शीर्ष-स्तरीय समारोह का प्रकार,

- एक प्रकार पैरामीटर (14.1) के डिफ़ॉल्ट तर्क में टाइप-आईडी, या

- type- एक प्रकार-पैरामीटर (14.2) के लिए टेम्पलेट-तर्क की आईडी।

संबंधित मुद्दे