সূচনা
আইএসওসি ++ 11 (আনুষ্ঠানিকভাবে আইএসও / আইইসি 14882: 2011) হ'ল সি ++ প্রোগ্রামিং ভাষার মানকতার সাম্প্রতিকতমতম সংস্করণ। এটিতে কিছু নতুন বৈশিষ্ট্য এবং ধারণা রয়েছে, উদাহরণস্বরূপ:
- মূল্যসূত্র উল্লেখ
- এক্সভ্যালু, গ্লুভ্যালু, মূল্য প্রকাশের মান বিভাগসমূহ
- শব্দার্থবিজ্ঞান সরান
আমরা যদি নতুন এক্সপ্রেশন মান বিভাগগুলির ধারণাগুলি বুঝতে চাই তবে আমাদের সচেতন হতে হবে যে মূল্যবোধ এবং মূল্যবোধ উল্লেখ রয়েছে। মূল্যায়নগুলি অ-নিরপেক্ষ মূল্যের রেফারেন্সগুলিতে দেওয়া যেতে পারে তা আরও ভাল।
int& r_i=7; // compile error
int&& rr_i=7; // OK
আমরা যদি ওয়ার্কিং ড্রাফ্ট N3337 (প্রকাশিত আইএসওসি ++ 11 মানকটির সাথে সর্বাধিক অনুরূপ খসড়া) থেকে ল্যাভালিউস এবং মূল্যবোধ শীর্ষক উপাংশটি উদ্ধৃত করি তবে আমরা মান বিভাগের ধারণাগুলির কিছুটা অন্তর্দৃষ্টি অর্জন করতে পারি।
৩.১০ মূল্য এবং মূল্য [বেসিক.লভাল]
1 চিত্র 1 এ সংজ্ঞা অনুসারে শ্রেণিবদ্ধ করা হয়েছে।
- একটি ল্যাভেলু (তথাকথিত, historতিহাসিকভাবে বলা হয়, কারণ লভ্যালুগুলি একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটির বাম-পাশে প্রদর্শিত হতে পারে) একটি ফাংশন বা কোনও অবজেক্টকে নির্ধারণ করে। [উদাহরণস্বরূপ: যদি E পয়েন্টার ধরণের একটি এক্সপ্রেশন হয়, তবে * E হল একটি মূল্যমানের বহিঃপ্রকাশ যা সেই অবজেক্ট বা ফাংশনকে বোঝায় যা ই পয়েন্ট করে। অন্য উদাহরণ হিসাবে, কোনও ফাংশন কল করার ফলাফল যার রিটার্ন টাইপ একটি লভ্যালু রেফারেন্স হয় একটি লভ্যালু। পরবর্তী উদাহরণ]
- একটি জালভ্যালু (একটি "এক্স্পায়ারিং" মান) একটি বস্তুকেও বোঝায়, সাধারণত তার জীবদ্দশার শেষের কাছে (যাতে এর উত্সগুলি সরানো যেতে পারে, উদাহরণস্বরূপ)। একটি জালভ্যালু হ'ল মূল ধরণের রেফারেন্স (8.3.2) জড়িত কিছু ধরণের অভিব্যক্তির ফলাফল। [উদাহরণস্বরূপ: কোনও ফাংশনকে কল করার ফলাফল যাঁর রিটার্ন টাইপটি মূল্যের রেফারেন্স হয় তা হল একটি মূল্য। পরবর্তী উদাহরণ]
- একটি গ্লাভ ("জেনারালাইজড" লভালু) হল একটি লভ্যালু বা একটি xvalue।
- একটি মূল্য (calledতিহাসিকভাবে বলা হয়, কারণ অ্যাসাইনমেন্ট এক্সপ্রেশনটির ডানদিকে মূল্যগুলি প্রদর্শিত হতে পারে) হল একটি মূল্য, একটি
অস্থায়ী বস্তু (12.2) বা এর সাবোবজেক্ট, বা কোনও মান যা
কোনও বস্তুর সাথে সম্পর্কিত নয় ।
- একটি মূল্য ("খাঁটি" মূল্য) একটি মূল্য যা কোনও মূল্য নয়। [উদাহরণস্বরূপ: কোনও ফাংশন কল করার ফলাফল যাঁর রিটার্নের
ধরণটি প্রসঙ্গ নয় a আক্ষরিকের যেমন 12, 7.3e5 বা
সত্যের মানও একটি মূল্য val পরবর্তী উদাহরণ]
প্রতিটি অভিব্যক্তি এই শ্রেণীবিন্যাসের ঠিক একটি মৌলিক শ্রেণিবিন্যাসের অন্তর্ভুক্ত: লভ্যালু, জালভ্যালু বা মূল্য। একটি অভিব্যক্তির এই সম্পত্তিটিকে এর মান বিভাগ বলা হয়।
তবে আমি এই বিষয়ে পুরোপুরি নিশ্চিত নই যে ধারণাগুলি পরিষ্কারভাবে বোঝার জন্য এই অনুচ্ছেদটি যথেষ্ট, কারণ "সাধারণত" সত্যই সাধারণ নয়, "তার জীবদ্দশার শেষের কাছাকাছি" আসলেই কংক্রিট নয়, "মূলসূত্রের উল্লেখগুলি জড়িত" সত্যই পরিষ্কার নয়, এবং "উদাহরণ: কোনও ফাংশনকে কল করার ফলাফল যাঁর রিটার্ন টাইপটি মূল্যের রেফারেন্স হয় তা হল একটি মূল্য।" সাপ তার লেজ কামড়ছে বলে মনে হচ্ছে।
প্রাথমিক মান ক্যাটাগরি
প্রতিটি অভিব্যক্তি ঠিক একটি প্রাথমিক মান বিভাগের অন্তর্গত। এই মান বিভাগগুলি মূল্য, xvalue এবং মূল্য মূল্য বিভাগ।
lvalues
E এক্সপ্রেশনটি লভালু বিভাগের অন্তর্গত এবং যদি কেবল E ই এমন একটি সত্তাকে বোঝায় যে আগে থেকেই একটি পরিচয় (ঠিকানা, নাম বা উপনাম) থাকে যা এটি E এর বাইরে অ্যাক্সেসযোগ্য করে তোলে makes
#include <iostream>
int i=7;
const int& f(){
return i;
}
int main()
{
std::cout<<&"www"<<std::endl; // The expression "www" in this row is an lvalue expression, because string literals are arrays and every array has an address.
i; // The expression i in this row is an lvalue expression, because it refers to the same entity ...
i; // ... as the entity the expression i in this row refers to.
int* p_i=new int(7);
*p_i; // The expression *p_i in this row is an lvalue expression, because it refers to the same entity ...
*p_i; // ... as the entity the expression *p_i in this row refers to.
const int& r_I=7;
r_I; // The expression r_I in this row is an lvalue expression, because it refers to the same entity ...
r_I; // ... as the entity the expression r_I in this row refers to.
f(); // The expression f() in this row is an lvalue expression, because it refers to the same entity ...
i; // ... as the entity the expression f() in this row refers to.
return 0;
}
xvalues
এক্সপ্রেশনটি এক্সভ্যালু বিভাগের অন্তর্গত যদি তা হয় এবং কেবল যদি তা হয়
- কোনও ফাংশনকে কল করার ফলাফল, যা স্পষ্টভাবে বা স্পষ্টতই, যার রিটার্ন টাইপ প্রত্যাবর্তনের বস্তুর প্রকারের মূল সূত্র, বা
int&& f(){
return 3;
}
int main()
{
f(); // The expression f() belongs to the xvalue category, because f() return type is an rvalue reference to object type.
return 0;
}
- অবজেক্ট টাইপের কোনও মূল্যের রেফারেন্সের কাস্ট বা or
int main()
{
static_cast<int&&>(7); // The expression static_cast<int&&>(7) belongs to the xvalue category, because it is a cast to an rvalue reference to object type.
std::move(7); // std::move(7) is equivalent to static_cast<int&&>(7).
return 0;
}
- কোনও শ্রেণীর সদস্য অ্যাক্সেস এক্সপ্রেশন অ-রেফারেন্স টাইপের একটি অ স্থিতিশীল ডেটা সদস্যকে ডিজাইন করে যেখানে অবজেক্ট এক্সপ্রেশনটি একটি এক্সাল্যু, বা
struct As
{
int i;
};
As&& f(){
return As();
}
int main()
{
f().i; // The expression f().i belongs to the xvalue category, because As::i is a non-static data member of non-reference type, and the subexpression f() belongs to the xvlaue category.
return 0;
}
- একটি পয়েন্টার-থেকে-সদস্য এক্সপ্রেশন যেখানে প্রথম অপারেন্ডটি একটি xvalue এবং দ্বিতীয় অপারেন্ড ডেটা সদস্যের জন্য পয়েন্টার।
নোট করুন যে উপরের নিয়মগুলির প্রভাব হ'ল অবজেক্টের নামযুক্ত মূল্যসূচক রেফারেন্সগুলি লভালিউস হিসাবে গণ্য করা হয় এবং অবজেক্টের নামবিহীন মূল্যবোধের রেফারেন্সগুলি xvalue হিসাবে গণ্য করা হয়; ক্রিয়াকলাপগুলির মূল্য সম্পর্কিত উল্লেখগুলি নাম দেওয়া হোক বা না থাকুক না কেন লভ্য হিসাবে বিবেচিত হবে।
#include <functional>
struct As
{
int i;
};
As&& f(){
return As();
}
int main()
{
f(); // The expression f() belongs to the xvalue category, because it refers to an unnamed rvalue reference to object.
As&& rr_a=As();
rr_a; // The expression rr_a belongs to the lvalue category, because it refers to a named rvalue reference to object.
std::ref(f); // The expression std::ref(f) belongs to the lvalue category, because it refers to an rvalue reference to function.
return 0;
}
prvalues
এক্সপ্রেশনটি pralue বিভাগের অন্তর্ভুক্ত যদি এবং কেবল যদি E না লভালু বা xvalue বিভাগের অন্তর্গত।
struct As
{
void f(){
this; // The expression this is a prvalue expression. Note, that the expression this is not a variable.
}
};
As f(){
return As();
}
int main()
{
f(); // The expression f() belongs to the prvalue category, because it belongs neither to the lvalue nor to the xvalue category.
return 0;
}
মিক্সড ভ্যালু ক্যাটাগরিগুলি
আরও দুটি গুরুত্বপূর্ণ মিশ্র মান মান বিভাগ আছে। এই মান বিভাগগুলি হ'ল মূল্য এবং আঠালো বিভাগ categories
rvalues
এক্সপ্রেশনটি মূলত বিভাগের অন্তর্ভুক্ত যদি এবং কেবল যদি ই Xvalue বিভাগের অন্তর্গত, বা মূল্য শ্রেণির অন্তর্গত।
নোট করুন যে এই সংজ্ঞাটির অর্থ হ'ল E অভিব্যক্তিটি যথাযথ বিভাগের অন্তর্গত এবং যদি কেবল E যদি এমন কোনও সত্তাকে বোঝায় যেটির কোনও পরিচয় নেই যা E YET এর বাইরে অ্যাক্সেসযোগ্য করে তোলে।
glvalues
E টি লভালু বিভাগের সাথে সম্পর্কিত হয় এবং কেবল E ই লভালু বিভাগের সাথে বা xvalue বিভাগের অন্তর্গত The
একটি ব্যবহারিক বিধি
স্কট মায়ার ল্যাভেলু থেকে মূল্যকে আলাদা করতে থাম্বের একটি খুব কার্যকর বিধি প্রকাশ করেছে ।
- আপনি যদি কোনও অভিব্যক্তির ঠিকানা নিতে পারেন তবে প্রকাশটি একটি মূল্য।
- যদি কোনও অভিব্যক্তির প্রকারটি একটি লভ্যালু রেফারেন্স হয় (যেমন, টি এবং বা কনস্ট টি এবং ইত্যাদি that), তবে সে অভিব্যক্তিটি একটি মূল্য।
- অন্যথায়, অভিব্যক্তিটি একটি মূল্য is ধারণাগতভাবে (এবং সাধারণত বাস্তবেও), মূল্যায়নগুলি অস্থায়ী অবজেক্টগুলির সাথে সম্পর্কিত, যেমন ফাংশন থেকে ফিরে এসেছে বা অন্তর্নিহিত ধরণের রূপান্তরগুলির মাধ্যমে তৈরি হয়েছিল। বেশিরভাগ আক্ষরিক মানগুলি (যেমন, 10 এবং 5.3 )ও মূল্যবোধ val