c++ - কনস্ট্রেশন রেফারেন্স দ্বারা ডিফল্ট আর্গুমেন্টের মানটি ফিরিয়ে দেওয়া ঠিক কি?




language-lawyer object-lifetime (2)

নীচের উদাহরণগুলির মতো স্থির রেফারেন্সের মাধ্যমে ডিফল্ট আর্গুমেন্টের মানটি ফেরত দেওয়া ঠিক হবে:

https://coliru.stacked-crooked.com/a/ff76e060a007723b

#include <string>

const std::string& foo(const std::string& s = std::string(""))
{
    return s;
}

int main()
{
    const std::string& s1 = foo();
    std::string s2 = foo();

    const std::string& s3 = foo("s");
    std::string s4 = foo("s");
}

আপনার কোডে, s3 এবং s3 উভয়ই রেফারেন্সগুলি উল্লেখ করে। s2 এবং s4 ঠিক আছে।

প্রথম কলে, অস্থায়ী ফাঁকা std::string অবজেক্টটি ডিফল্ট আর্গুমেন্ট থেকে তৈরি করা কলটি সম্বলিত অভিব্যক্তির প্রসঙ্গে তৈরি করা হবে। সুতরাং, এটি এস 1 এর সংজ্ঞাটির শেষে মারা যাবে, যা এস 1 টি s1 ছেড়ে দেয়।

দ্বিতীয় কলটিতে অস্থায়ী std::string অবজেক্টটি s2 আরম্ভ করার জন্য ব্যবহৃত হয়, তারপরে এটি মারা যায়।

তৃতীয় কলে, স্ট্রিং আক্ষরিক "s" একটি অস্থায়ী std::string অবজেক্ট তৈরি করতে ব্যবহৃত হয় এবং এটি s3 3 এর সংজ্ঞা শেষে s3 3 s3 রেখে মারা যায়।

চতুর্থ কলে, অস্থায়ী std::string অবজেক্টটি "s" মান সহ s4 আরম্ভ করার জন্য ব্যবহৃত হয় এবং তারপরে এটি মারা যায়।

সি ++ 17 দেখুন [শ্রেণী.কালীন] / 6.1

একটি ফাংশন কলে (8.2.2) রেফারেন্স প্যারামিটারে আবদ্ধ একটি অস্থায়ী বস্তু কলযুক্ত পূর্ণ-এক্সপ্রেশন সমাপ্ত না হওয়া অবধি স্থায়ী থাকে।


এটি নিরাপদ নয় :

সাধারণভাবে, একটি অস্থায়ী জীবনকাল "" এটি পাস করে "আরও বাড়ানো যায় না: একটি দ্বিতীয় রেফারেন্স, যা অস্থায়ীভাবে আবদ্ধ ছিল সেই রেফারেন্স থেকে আরম্ভ করা তার জীবনকালকে প্রভাবিত করে না।





reference-binding