মূলসূত্র উল্লেখ সম্পর্কে এই ভিজ্যুয়াল সি ++ ব্লগ নিবন্ধ থেকে :
... সি ++ চান না যে আপনি দুর্ঘটনাক্রমে অস্থায়ী সংস্থাগুলি সংশোধন করতে পারেন, তবে পরিবর্তিত মূল্যবোধে অ-কনস্ট্যান্ট সদস্য ফাংশনটি সরাসরি কল করা সুস্পষ্ট, সুতরাং এটি অনুমোদিত ...
মূলত, আপনি অস্থায়ী বস্তু এবং খুব যে কোনও মুহুর্তেই মারা যাবেন এমন কারণে খুব অল্প সময়ের জন্য আপনি টেম্পোরারিগুলি সংশোধন করার চেষ্টা করবেন না। যে কারণে আপনাকে নন-কনস্ট্যান্ড পদ্ধতিতে কল করার অনুমতি দেওয়া হয়েছে তা হ'ল ভাল, আপনি কিছু "বোকামি" জিনিসগুলি করতে পারবেন যতক্ষণ আপনি জানেন যে আপনি কী করছেন এবং আপনি এ সম্পর্কে স্পষ্ট হয়ে আছেন (যেমন, পুনরায় ব্যাখ্যা_কাস্ট ব্যবহার করে)। তবে আপনি যদি কোনও অস্থায়ী রেফারেন্সকে অস্থায়ীভাবে বেঁধে রাখেন, তবে আপনি কেবলমাত্র "চিরকালের" দিকে এটি অবিরত রাখতে পারেন যাতে আপনার জিনিসটির হেরফেরটি অদৃশ্য হয়ে যায়, কারণ আপনি যেভাবে কোথাও পুরোপুরি ভুলে গিয়েছিলেন এটি একটি অস্থায়ী ছিল।
আমি যদি আপনি হয়ে থাকি তবে আমি আমার ফাংশনগুলির নকশাটি পুনর্বিবেচনা করতাম। কেন জি () রেফারেন্স গ্রহণ করছে, এটি প্যারামিটারটি সংশোধন করে? যদি না হয়, তবে এটি হ'ল রেফারেন্স করুন, যদি হ্যাঁ, আপনি কেন এটিতে অস্থায়ী হয়ে যাওয়ার চেষ্টা করেন, আপনি এটি পরিবর্তন করছেন যে অস্থায়ী তা যত্ন করছেন না? কেন getx () যাইহোক অস্থায়ী ফিরে আসছে? আপনি যদি আমাদের আসল পরিস্থিতি এবং আপনি যা সম্পাদন করতে চেষ্টা করছেন তা আমাদের সাথে ভাগ করে নেন তবে কীভাবে এটি করবেন সে সম্পর্কে আপনি কিছু ভাল পরামর্শ পেতে পারেন।
ভাষার বিরুদ্ধে গিয়ে সংকলককে বোকা বানানো খুব কমই সমস্যা সমাধান করে - সাধারণত এটি সমস্যা তৈরি করে।
সম্পাদনা করুন: মন্তব্যে প্রশ্নগুলিতে সম্বোধন করা: 1)
X& x = getx().ref(); // OK when will x die?
- আমি জানি না এবং আমি যত্নও করি না, কারণ "ভাষার বিরুদ্ধে যাওয়া" বলতে আমি এটাই বুঝি। ভাষাটি বলেছে "বিবৃতি শেষে অস্থায়ীদের মৃত্যু হয়, যদি না তারা রেফারেন্সের সীমাবদ্ধ থাকে, যদি তারা রেফারেন্সের সুযোগের বাইরে চলে যায় তবে তারা মারা যায়"। এই নিয়মটি প্রয়োগ করে, পরবর্তী বিবৃতিটির শুরুতে এটি x ইতিমধ্যে মারা গেছে বলে মনে হচ্ছে, কারণ এটি রেফারেন্সের জন্য আবদ্ধ নয় (সংকলকটি রেফ () কী দেয়) তা জানে না। এটি অবশ্য একটি অনুমান মাত্র।
2) আমি উদ্দেশ্যটি স্পষ্টভাবে বলেছি: আপনাকে অস্থায়ী পরিবর্তনগুলি করার অনুমতি দেওয়া হচ্ছে না, কারণ এটি কেবল অর্থবোধ করে না (সি ++ 0 এক্সের মূল্যায়ন উল্লেখগুলি উপেক্ষা করে)। প্রশ্ন "তাহলে আমাকে কেন নন-কনস্ট্যান্ট সদস্যদের কল করার অনুমতি দেওয়া হচ্ছে?" এটি একটি ভাল, তবে আমি ইতিমধ্যে উপরে উল্লিখিত উত্তরটির চেয়ে উত্তম উত্তর আমার কাছে নেই।
3) ঠিক আছে, যদি আমি X& x = getx().ref();
বিবৃতিটির শেষে মরে প্রায় এক্স সম্পর্কে ঠিক থাকি তবে সমস্যাগুলি সুস্পষ্ট।
যাইহোক, আপনার প্রশ্ন এবং মন্তব্যের ভিত্তিতে আমি ভাবি না যে এই অতিরিক্ত উত্তরগুলিও আপনাকে সন্তুষ্ট করবে। এখানে একটি চূড়ান্ত প্রচেষ্টা / সংক্ষিপ্তসার রয়েছে: সি ++ কমিটি সিদ্ধান্ত নিয়েছে যে অস্থায়ী সংস্থাগুলি সংশোধন করা কোনও অর্থবোধ নয়, অতএব, তারা নন-কনস্ট্যান্ট রেফারেন্সগুলিকে বাধ্যতামূলক করার বিষয়টি অস্বীকার করে। কিছু সংকলক বাস্তবায়ন হতে পারে বা historicতিহাসিক সমস্যাগুলিও জড়িত ছিল, আমি জানি না। তারপরে, কিছু নির্দিষ্ট কেস উদ্ভূত হয়েছিল এবং সিদ্ধান্ত নেওয়া হয়েছিল যে সমস্ত প্রতিকূলতার বিরুদ্ধে, তারা এখনও নন-কনস্ট্যান্ট পদ্ধতি কল করার মাধ্যমে সরাসরি পরিবর্তনের অনুমতি দেবে। তবে এটি ব্যতিক্রম - আপনাকে সাধারণত অস্থায়ী পরিবর্তনগুলি করার অনুমতি দেওয়া হয় না। হ্যাঁ, সি ++ প্রায়শই অদ্ভুত।