ভুল ফর্ম:
int &z = 12;
সঠিক গঠন:
int y;
int &r = y;
প্রশ্ন :
প্রথম কোডটি ভুল কেন? শিরোনামে ত্রুটির" অর্থ "কী?
ভুল ফর্ম:
int &z = 12;
সঠিক গঠন:
int y;
int &r = y;
প্রশ্ন :
প্রথম কোডটি ভুল কেন? শিরোনামে ত্রুটির" অর্থ "কী?
(ostringstream() << "x=" << x).str()
উত্তর:
সি ++ 03 3.10 / 1 বলেছেন: "প্রতিটি অভিব্যক্তি হয় একটি মূল্য বা মূল্য val" এটা মনে রাখা গুরুত্বপূর্ণ যে স্বচ্ছতা বনাম মূল্যবৃদ্ধি হ'ল অভিব্যক্তির সম্পত্তি, বস্তুর নয়।
ল্যাভেলুয়েসগুলির নামের নাম অবজেক্টস যা একক অভিব্যক্তির বাইরেও অবিচল থাকে। উদাহরণস্বরূপ, obj, *ptr, ptr[index], এবং ++xসব lvalues হয়।
মূল্যগুলি হ'ল অস্থায়ী যা সম্পূর্ণ-এক্সপ্রেশন যেখানে তারা বাস করে ("সেমিকোলনে") শেষে বাষ্পীভূত হয়। উদাহরণস্বরূপ, 1729, x + y, std::string("meow"), এবং x++সব rvalues হয়।
অপারেটরের ঠিকানাটির প্রয়োজন হয় এটির "অপারেন্ডটি একটি মূল্য হবে"। আমরা যদি একটি অভিব্যক্তির ঠিকানা নিতে পারি, ভাবটি হ'ল মূল্য, অন্যথায় এটি একটি মূল্য।
&obj; // valid
&12; //invalid
int & = 12;অবৈধ তা কেবল উত্তর দেওয়ার জন্য, স্ট্যান্ডার্ডটি বলে যে স্ট্রিং আক্ষরিক একটি লভ্যালু, অন্যান্য আক্ষরিক মূল্যগুলি val
std::string("meow")প্রকারের একটি বস্তু নির্মান std::stringএবং rvalue যে এই বস্তু designates, উৎপাদ 1729কোন পার্শ্ব প্রতিক্রিয়া এবং উৎপাদনের মান আছে 1729 টাইপের একটি মূল্য হিসাবে int।
"Lvalues name objects that persist beyond a single expression."একটি 100% সঠিক বিবৃতি। বিপরীতে, আপনার উদাহরণটি (const int &)1ভুল, কারণ এটি কোনও "নামযুক্ত" বস্তু নয়।
int &z = 12;
ডানদিকে, intঅবিচ্ছেদ্য আক্ষরিক থেকে টাইপের একটি অস্থায়ী বস্তু তৈরি করা হয় 12, তবে অস্থায়ীটি অ-কনস্ট্যান্ট রেফারেন্সে আবদ্ধ হতে পারে না। সুতরাং ত্রুটি। এটি যেমন:
int &z = int(12); //still same error
কেন একটি অস্থায়ী তৈরি হয়? কারণ একটি রেফারেন্স মেমরির কোনও অবজেক্টকে উল্লেখ করতে হয় এবং কোনও অবজেক্টের অস্তিত্বের জন্য, এটি প্রথমে তৈরি করতে হবে। যেহেতু বস্তুটি নামবিহীন, এটি একটি অস্থায়ী বস্তু। এর কোনও নাম নেই। এই ব্যাখ্যা থেকে, এটি বেশ পরিষ্কার হয়ে গেছে যে দ্বিতীয় মামলাটি কেন ঠিক আছে।
একটি অস্থায়ী বস্তু রেফারেন্সের সাথে আবদ্ধ হতে পারে, যার অর্থ আপনি এটি করতে পারেন:
const int &z = 12; //ok
সম্পূর্ণতার জন্য, আমি যুক্ত করতে চাই যে সি ++ 11 রুল্যু-রেফারেন্স চালু করেছে, যা অস্থায়ী বস্তুর সাথে আবদ্ধ হতে পারে। সুতরাং সি ++ 11 এ আপনি এটি লিখতে পারেন:
int && z = 12; //C+11 only
লক্ষ করুন যে এর &&আন্তঃ আছে &। এছাড়াও নোট করুন যে constআর প্রয়োজন হয় না, যদিও যে বস্তুটি zবেঁধে রাখে তা অবিচ্ছেদ্য-আক্ষরিক থেকে তৈরি অস্থায়ী বস্তু 12।
যেহেতু সি ++ 11 মূল মূল্য-রেফারেন্স চালু করেছে , int&এখন থেকে তাকে বলা হয় ল্যাভেলু-রেফারেন্স ।
12একটি সংকলন-সময় ধ্রুবক যা রেফারেন্সকৃত ডেটার বিপরীতে পরিবর্তন করা যায় না int&। আপনি যা করতে পারেন তা হ'ল
const int& z = 12;
void f( vector<int> const & ), যা কোনও ভেক্টরকে সংশোধন করতে হবে না তা পাস করার জন্য মূর্তিমান। এখন সমস্যাটি হ'ল এটি f( vector<int>(5) )ভুল হবে এবং ব্যবহারকারীকে একটি আলাদা ওভারলোড সরবরাহ করতে হবে void f( vector<int> v ) { f(v); }যা তুচ্ছ।
f( vector<int>(5) )সংকলক একটি অস্থায়ী তৈরি করে এবং তারপরে সেই অস্থায়ীটির রেফারেন্সকে বেঁধে রাখে এবং একইভাবে যদি 5সরাসরি থেকে কোনও অন্তর্নিহিত রূপান্তর হয় । এটি সংকলকটি ফাংশনের জন্য একটি একক স্বাক্ষর তৈরি করতে দেয় এবং ফাংশনের একক ব্যবহারকারীর প্রয়োগ সক্ষম করে। সেখান থেকে, ধারাবাহিকতার জন্য ধ্রুবক রেফারেন্সগুলির অবশিষ্ট ব্যবহারের জন্য অনুরূপ আচরণটি সংজ্ঞায়িত করা হয়।
T const & r = *ptr;, rফাংশনে কোনও পরবর্তী ব্যবহার প্রতিস্থাপন করা যেতে পারে *ptr, এবং rরানটাইমটিতে বিদ্যমান থাকার প্রয়োজন নেই) অথবা এটি কোনও পদক্ষেপের (যেমন কোনও বস্তুর সদস্য হিসাবে একটি রেফারেন্স সংরক্ষণ করার বিবেচনা করুন) ঠিকানা রেখে এই প্রয়োগ করতে হতে পারে - যা একটি স্বতঃসংশ্লিষ্ট পয়েন্টার হিসাবে প্রয়োগ করা হয়।
এগুলি সি ++ ভাষার নিয়ম:
12) একটি "মূল্য"int &ri = 12;মন্দ গঠিতআপনাকে বুঝতে হবে যে এটি সি ++ নিয়ম। তারা ঠিক আছে।
কিছুটা আলাদা বিধি সহ আলাদা আলাদা ভাষা উদ্ভাবন করা সহজ, সি ++ 'বলুন। সি ++ 'তে, এটি কোনও মূল্যমানের সাথে একটি নিরপেক্ষ রেফারেন্স তৈরি করার অনুমতি দেওয়া হবে। এখানে অসঙ্গত বা অসম্ভব কিছু নেই।
তবে এটি এমন কিছু ঝুঁকিপূর্ণ কোডের মঞ্জুরি দেবে যেখানে প্রোগ্রামার তার উদ্দেশ্যটি নাও পেতে পারে এবং সি ++ ডিজাইনাররা ঠিক সেই ঝুঁকি এড়াতে সিদ্ধান্ত নিয়েছে।
উল্লেখগুলি হ'ল "লুকানো পয়েন্টার" (অ-নাল) এমন জিনিসের প্রতি পরিবর্তন করতে পারে (মানগুলি)। আপনি একটি ধ্রুবক তাদের সংজ্ঞায়িত করতে পারবেন না। এটি একটি "পরিবর্তনশীল" জিনিস হওয়া উচিত।
সম্পাদনা ::
আমি ভাবছি
int &x = y;
প্রায় সমতুল্য হিসাবে
int* __px = &y;
#define x (*__px)
__pxএকটি নতুন নাম কোথায় , এবং #define xকেবলমাত্র xরেফারেন্সের ঘোষণামূলক ব্লকের ভিতরে কাজ করে ।
const:)
const