আমার বোধগম্যতা হল যে সি ++ ১১-এ, যখন আপনি কোনও ফাংশন থেকে মান অনুসারে একটি স্থানীয় ভেরিয়েবল ফিরিয়ে দেন, সংকলকটিকে সেই পরিবর্তনশীলটিকে আর-মান রেফারেন্স হিসাবে বিবেচনা করার অনুমতি দেয় এবং ফাংশন থেকে 'চালিত' করে এটি ফিরিয়ে দেয় (যদি আরভিও / এনআরভিও এর পরিবর্তে ঘটে না, অবশ্যই)।
আমার প্রশ্ন, এটি কি বিদ্যমান কোডটি ভাঙতে পারে না?
নিম্নলিখিত কোড বিবেচনা করুন:
#include <iostream>
#include <string>
struct bar
{
bar(const std::string& str) : _str(str) {}
bar(const bar&) = delete;
bar(bar&& other) : _str(std::move(other._str)) {other._str = "Stolen";}
void print() {std::cout << _str << std::endl;}
std::string _str;
};
struct foo
{
foo(bar& b) : _b(b) {}
~foo() {_b.print();}
bar& _b;
};
bar foobar()
{
bar b("Hello, World!");
foo f(b);
return std::move(b);
}
int main()
{
foobar();
return EXIT_SUCCESS;
}
আমার ধারণা ছিল যে কোনও স্থানীয় অবজেক্টের ডেস্ট্রাক্টরের পক্ষে অবজেক্টটি সরানো হয়ে যাওয়া বস্তুর রেফারেন্স করা সম্ভব হবে এবং অতএব অপ্রত্যাশিতভাবে একটি 'খালি' অবজেক্টটি দেখুন। আমি এটি পরীক্ষা করার চেষ্টা করেছি (দেখুন http://ideone.com/ZURoeT ), তবে আমি পরিষ্কার std::move
না করেই 'সঠিক' ফলাফল পেয়েছি foobar()
। আমি অনুমান করছি যে এটি এনআরভিওর কারণে হয়েছিল তবে আমি সেটি অক্ষম করার জন্য কোডটি পুনরায় সাজানোর চেষ্টা করিনি।
আমি কি ঠিক করছি যে এই রূপান্তরটি (ক্রিয়াকলাপের বাইরে চলে যাওয়ার কারণ) স্পষ্টভাবে ঘটে এবং বিদ্যমান কোডটি ভেঙে দিতে পারে?
আপডেট এখানে একটি উদাহরণ যা আমি কী সম্পর্কে কথা বলছি তা বোঝায়। নিম্নলিখিত দুটি লিঙ্ক একই কোডের জন্য। http://ideone.com/4GFIRu - সি ++ 03 http://ideone.com/FcL2Xj - সি ++ 11
যদি আপনি আউটপুট দেখুন, এটি ভিন্ন।
সুতরাং, আমি অনুমান করি যে এই প্রশ্নটি এখন পরিণত হয়, মানটিতে অন্তর্নিহিত পদক্ষেপ যুক্ত করার সময় এটিই বিবেচনা করা হয়েছিল এবং এই জাতীয় কোডটি যথেষ্ট বিরল হওয়ায় এই ব্রেকিং পরিবর্তনটি যুক্ত করা ঠিক হবে কিনা তা সিদ্ধান্ত নেওয়া হয়েছিল? আমি আরও ভাবছি যে কোনও সংকলক যদি এরকম ক্ষেত্রে সতর্ক করে দেয় ...