এটি স্ট্রিংয়ের পরে কী করবে তার উপর নির্ভর করে।
আপনার প্রশ্নটি যদি আমার কোডটি সঠিক হয়? তাহলে হ্যাঁ
থেকে [dcl.fct.default] / 2
[ উদাহরণ : ঘোষণা
void point(int = 3, int = 4);
শূন্য, এক, বা টাইপ ইন্টের দুটি আর্গুমেন্ট সহ কল করা যেতে পারে এমন একটি ফাংশন ঘোষণা করে। এটি যেকোন উপায়ে বলা যেতে পারে:
point(1,2); point(1); point();
শেষ দুটি কল সমান point(1,4)
এবংpoint(3,4)
যথাক্রমে । - শেষ উদাহরণ ]
সুতরাং আপনার কোড কার্যকরভাবে এর সমতুল্য:
const std::string& s1 = foo(std::string(""));
std::string s2 = foo(std::string(""));
আপনার সমস্ত কোড সঠিক, তবে এই ক্ষেত্রে কোনও ক্ষেত্রে রেফারেন্সের আজীবন এক্সটেনশন নেই, যেহেতু রিটার্নের ধরণটি একটি রেফারেন্স।
যেহেতু আপনি কোনও অস্থায়ী সাথে কোনও ফাংশনটি কল করেন, ফিরে আসা স্ট্রিংয়ের আজীবন বিবৃতিটি প্রসারিত করে না।
const std::string& s1 = foo(std::string("")); // okay
s1; // not okay, s1 is dead. s1 is the temporary.
আপনার উদাহরণটি s2
ঠিক আছে যেহেতু আপনি সেটমেন্ট শেষ হওয়ার আগে অস্থায়ী থেকে অনুলিপি করেছেন (বা সরানো)। s3
তুলনায় একই সমস্যা আছে s1
।
std::string
আপনার নিজের শ্রেণীর সাথে প্রতিস্থাপন করুন যাতে আপনি নির্মাণ এবং ধ্বংস ট্র্যাক করতে পারেন।