2013-05-22 7 views
8

उदाहरण कोड लिया जाता है से: http://en.cppreference.com/w/cpp/types/add_cv (मैं एक छोटे से संशोधित।)एक कॉन्स अस्थायी कैसे एक कॉन्स पर गैर-कॉन्स सदस्य फ़ंक्शन को कॉल करने का विकल्प चुनता है?

struct foo 
{ 
    void m() { std::cout << "Non-cv\n"; } 
    void m() const { std::cout << "Const\n"; } 
}; 

template<class T> 
void call_m() 
{ 
    T().m(); 
} 

int main() 
{ 
    call_m<foo>(); 
    call_m<const foo>(); //here 
} 

और उत्पादन होता है:

Non-cv 
Non-cv 
दूसरी कॉल में

, T स्थिरांक योग्य है, इसलिए T() चाहिए कॉन्स संस्करण को कॉल करें, है ना? या क्या मुझे कुछ विशेष नियम याद आए हैं?

+3

MSVC में एक बग की तरह लग रहा है, जी के बाद से ++ - 4.8 और बजना ++ - 3.2 कॉल स्थिरांक कार्य करते हैं। – ForEveR

+0

हाँ, यह एक बग है जो पहले आया है। एमएसवीसी 'टी '(' '' में 'टी' के कॉन्स क्वालीफायरों को अनदेखा करता है। –

+1

भाषा शब्दकोष की आवश्यकता है कि आपके टेम्पलेट के अंदर, यदि 'टी' एक ** गैर-वर्ग ** प्रकार संभव कॉन्स-अस्थिर योग्यता के साथ टाइप करता है, तो * prvalue * उत्पन्न करते समय योग्यता गिरा दी जाती है। ऐसा लगता है कि वीएस कक्षा के प्रकारों के लिए भी उसी तर्क का उपयोग कर रहा है (गलत तरीके से) –

उत्तर

3

मानक से प्रासंगिक उद्धरण है 5.2.3 [expr.type.conv]/2

अभिव्यक्ति टी(), जहां टी एक सरल प्रकार-विनिर्देशक या एक के लिए typename-विनिर्देशक है गैर-सरणी पूर्ण ob-ject प्रकार या (संभवतः सीवी-योग्य) शून्य प्रकार, निर्दिष्ट प्रकार का एक प्रसार बनाता है, जो मूल्य-प्रारंभ होता है (8.5; शून्य() मामले के लिए कोई प्रारंभिकता नहीं की जाती है)। [नोट: यदि टी एक गैर-वर्ग प्रकार है जो सीवी-योग्यता है, परिणामी प्रसार (3.10) के प्रकार का निर्धारण करते समय सीवी-क्वालिफ़ायर को अनदेखा कर दिया जाता है। अंत टिप्पणी]

मानक खासतौर पर इसका उल्लेख में शब्दों (गैर प्रामाणिक रूप में) है कि गैर वर्ग के लिए प्रकार स्थिरांक-वाष्पशील योग्यता गिरा दिया जाता है, लेकिन आपके मामले में प्रकार एक वर्ग है, और नोट लागू नहीं होता है। ऐसा लगता है कि वीएस एक ही नियम लागू कर रहा है जो गैर-वर्ग प्रकारों के लिए लागू होता है।

+0

धन्यवाद – Frahm

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