2013-09-27 4 views
10
#include <new> 

using namespace std; 

void f(void*) 
{} 

struct A 
{}; 

int main() 
{ 
    A a; 

    f((a.~A(), &a)); // OK 
    new (&a) A(); // OK 

    new ((a.~A(), &a)) A(); // error C2059: syntax error : 'type' 
} 

मुझे लगता है (ए। ~ ए(), & ए) एक वैध अभिव्यक्ति है जिसका मूल्यांकन सूचक मूल्य के लिए किया जा सकता है, इसलिए इसे प्लेसमेंट तर्क के रूप में स्वीकार किया जाना चाहिए, नतीजा क्यों नहीं है?नियुक्ति तर्क के रूप में उपयोग किए जाने पर अल्पविराम अभिव्यक्ति अपेक्षित के रूप में क्यों काम नहीं करती है?

मेरे संकलक कुलपति ++ 2013 आर सी है। क्या यह एक कंपाइलर बग है?

अद्यतन:

मैं connect.microsoft.com

+0

मेरे लिए एक बग की तरह लग रहा। –

उत्तर

3

हाँ करने के लिए एक बग summitted है, यह एक संकलक बग है, वाक्य रचना सही है।

आप मानक में व्याकरण देख सकते हैं:

new-placement: 
(expression-list) 

और, a.~A(), &a एक अभिव्यक्ति-सूची के रूप में मान्य है।

+0

मुझे लगता है कि आप क्या सोच रहे हैं गलत समझा। 'नया' एक एकल तर्क प्राप्त कर रहा है: दो अभिव्यक्ति अल्पविराम ऑपरेटर द्वारा अलग और कोष्ठक से घिरा हुआ है। इसे स्वीकार नहीं करना अभी भी एक कंपाइलर बग है। (मैं एक मरे हुए वस्तु का पता लेने की वैधता पर यकीन नहीं है।) – CTMacUser

+0

@CTMacUser: एक मृत या नहीं अभी तक निर्माण वस्तु का पता लेने मान्य है, हालांकि आपरेशन आप इस तरह के एक पते के साथ क्या कर सकते हैं बहुत ही सीमित हैं चूंकि इसे अस्वीकार करने का कोई प्रयास अपरिभाषित व्यवहार है। –

+0

@CTMacUser: हां, इस तरह कॉमा ऑपरेटर काम करता है, लेकिन यह सिंटैक्स त्रुटि के रूप में विफल रहा है, इसलिए यह ऑपरेटरों का मूल्यांकन नहीं कर रहा है। –

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

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