ऑपरेटर नए और निर्माता के तर्क का निष्पादन आदेश


9

क्या सी ++ कल्पना क्रम निर्दिष्ट operator newऔर के निर्माता Aमें new C(A())
जी ++ ने ऑर्डर को A()-> new-> होने दिया C(), लेकिन क्लैंग ++ ने इसे रहने दिया new-> A()-> C()
क्या अंतर अनिर्दिष्ट व्यवहार के कारण है?

g ++: 7.4.0 clang ++: 10.0.0

#include <iostream>
#include <cstdlib>

struct A {
    A() {
        std::cout << "call A()\n";
    }
};

struct C {
    C(A) {
        std::cout << "call S()\n";
    }

    void *operator new(size_t s) {
        std::cout << "call new()\n";
        return malloc(s);
    }
};

int main() {
    void *p = new C(A());
}

3
क्या आप C ++ 17, C ++ 14 या पूर्व के रूप में निर्माण कर रहे हैं?
स्टोरीटेलर - Unslander मोनिका

4
दो नोट: आपने इसे "सी" के साथ टैग किया है, जो स्पष्ट रूप से दिखाता है कि आपने उस टैग का विवरण नहीं पढ़ा है। मत करो। अब, आप "अपरिभाषित व्यवहार" (यूबी) के बारे में पूछते हैं। यह सी ++ मानक द्वारा उपयोग की जाने वाली एक ऐसी चीज है जो उन चीजों को चिह्नित करने के लिए है जहां कुछ भी हो सकता है और जिसे टाला जाना चाहिए। "अनिर्दिष्ट व्यवहार" भी है, जो संभवतः आपके बाद के करीब है, क्योंकि कोड तकनीकी रूप से ठीक है और यूबी का कारण नहीं है।
उलरिच एकहार्ट

1
@Ulrich Eckhardt आपके सुझाव का धन्यवाद। मैंने दोनों को मिलाया।
एडी कुओ

जवाबों:


11

क्लैंग सही है। C ++ 17 के बाद से निष्पादन आदेश की गारंटी है। [expr.new] / 19

आवंटन समारोह का आह्वान नए-प्रारंभिक में अभिव्यक्तियों के मूल्यांकन से पहले किया जाता है

operator new(आवंटन कार्य) को पहले लागू किया जाना चाहिए, फिर नए-प्रारंभिक (यानी A()) में अभिव्यक्ति का मूल्यांकन ।

C ++ 17 से पहले, आदेश की गारंटी नहीं है। [expr.new] / 18 (C ++ 14)

आवंटन समारोह का आह्वान नए-प्रारंभिक में अभिव्यक्तियों के मूल्यांकन के संबंध में अनिश्चित काल के लिए अनुक्रमित है


ऐसा लगता है कि सीसीसी 17 (और बाद में) के अनुरूप नहीं है; C ++ 2a मोड में gcc10 के साथ संकलन करने पर समान परिणाम मिलता है।

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