অপারেটরের এক্সিকিউশন অর্ডার নতুন এবং কনস্ট্রাক্টরের আর্গুমেন্ট


9

নেই সি ++ বৈশিষ্ট অর্ডার উল্লেখ operator newএবং কন্সট্রাকটর Aমধ্যে new C(A())
জি ++ অর্ডারটি A()-> new-> C()হতে দিন, তবে ঝাঁকুনি ++ হতে দিন new-> A()-> C()
পার্থক্য কি অনির্দিষ্ট আচরণের কারণে ঘটে?

g ++: 7.4.0 ঝনঝন ++: 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
আপনি কি সি ++ 17, সি ++ 14 বা তার আগের হিসাবে তৈরি করছেন?
গল্পগ্রাহক - আনস্ল্যান্ডার মনিকা

4
দুটি নোট: আপনি এটি "সি" দিয়ে ট্যাগ করেছেন, যা পরিষ্কারভাবে দেখায় যে আপনি সেই ট্যাগটির বিবরণটি পড়েন নি। না। এখন, আপনি "অপরিজ্ঞাত আচরণ" (ইউবি) সম্পর্কে জিজ্ঞাসা করছেন। এটি এমন একটি শব্দ যা সি ++ স্ট্যান্ডার্ড দ্বারা ব্যবহৃত জিনিসগুলি চিহ্নিত করতে ব্যবহৃত হয় যেখানে কিছু ঘটতে পারে এবং যা এড়ানো উচিত। এছাড়াও "অনির্ধারিত আচরণ" রয়েছে, যা সম্ভবত আপনি যা যা করছেন তার পরে সম্ভবত, কারণ কোডটি প্রযুক্তিগতভাবে ভাল এবং ইউবির কারণ হয় না।
উলিরিচ এখার্ড্ট

1
@ অলিখ এ্যাকহার্ট আপনার পরামর্শটি ধন্যবাদ। আমি দুটোকে মিশিয়েছি।
এডি কুও

উত্তর:


11

ঝাঁকুনি ঠিক আছে। যেহেতু সি ++ 17 কার্যকর করা আদেশের গ্যারান্টিযুক্ত। [expr.new] / 19

নতুন-ইনিশিয়ালাইজারে অভিব্যক্তিগুলির মূল্যায়নের আগে বরাদ্দ ফাংশনের অনুরোধটি ক্রমযুক্ত হয়

operator new(বরাদ্দ ফাংশন) প্রথমে আহ্বান করা হয়, তারপরে নতুন-ইনিশিয়ালাইজারে (অর্থাত্ A()) অভিব্যক্তির মূল্যায়ন ।

সি ++ 17 এর আগে, অর্ডারের গ্যারান্টি নেই। [এক্সপ্রেস নতুন] / 18 (সি ++ 14)

বরাদ্দ ফাংশনের আবাহন অনিশ্চিতভাবে মধ্যে অভিব্যক্তির মূল্যায়ন থেকে সম্মান সঙ্গে সিকোয়েন্স করা হয় নতুন সূচনাকারী


দেখে মনে হচ্ছে জিসিসি সি ++ 17 (এবং তারপরে) অনুসারে নয়; সিসি + 2 2 মোডে জিসিসি 10 সহ সংকলন একই ফলাফল দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.