හැදින්වීම
ISOC ++ 11 (නිල වශයෙන් ISO / IEC 14882: 2011) යනු C ++ ක්රමලේඛන භාෂාවේ ප්රමිතියේ නවතම අනුවාදයයි. එහි නව විශේෂාංග සහ සංකල්ප අඩංගු වේ, උදාහරණයක් ලෙස:
- rvalue යොමුව
- xvalue, glvalue, prvalue ප්රකාශන අගය කාණ්ඩ
- අර්ථකථන ගෙනයන්න
නව ප්රකාශන අගය කාණ්ඩවල සංකල්ප තේරුම් ගැනීමට අප කැමති නම්, අගය සහ අගයන් යොමු කිරීම් ඇති බව අප දැන සිටිය යුතුය. Rvalues නොවරදින rvalue යොමු වෙත යොමු කළ හැකි බව දැන ගැනීම වඩා හොඳය.
int& r_i=7; // compile error
int&& rr_i=7; // OK
වැඩ කරන කෙටුම්පත වන N3337 (ප්රකාශිත ISOC ++ 11 ප්රමිතියට වඩාත්ම සමාන කෙටුම්පත) වෙතින් Lvalues සහ Rvalues යන උපවගන්තිය උපුටා දැක්වුවහොත් අපට වටිනාකම් කාණ්ඩ පිළිබඳ සංකල්ප පිළිබඳ යම් අවබෝධයක් ලබා ගත හැකිය.
3.10 අගයන් සහ අගයන් [basic.lval]
රූප සටහන 1 හි වර්ගීකරනය අනුව ප්රකාශන වර්ගීකරණය කර ඇත.
- Lvalue (පැවරුම් ප්රකාශනයක වම් පසින් lvalues දිස්විය හැකි නිසා ically තිහාසිකව ඊනියා) ශ්රිතයක් හෝ වස්තුවක් නියම කරයි. . තවත් උදාහරණයක් ලෙස, ශ්රිතයක් ආපසු යැවීමේ වර්ගය lvalue යොමු කිරීමක් ලෙස හැඳින්වීමේ ප්රති result ලය lvalue වේ. උදාහරණයක් ලෙස]
- Xvalue (“eXpiring” අගයක්) යනු සාමාන්යයෙන් වස්තුවක් එහි ආයු කාලය අවසන් වීමට ආසන්නය (උදාහරණයක් ලෙස එහි සම්පත් ගෙනයාමට). Xvalue යනු අගය යොමු කිරීම් (8.3.2) සම්බන්ධ වන ඇතැම් ප්රකාශනවල ප්රති result ලයකි. [උදාහරණය: ප්රතිලාභ වර්ගයක් වන අගය යොමු කිරීමක් වන ශ්රිතයක් ඇමතීමේ ප්රති x ලය xvalue වේ. උදාහරණයක් ලෙස]
- ග්ලව් අගය (“සාමාන්යකරණය කරන ලද” අගය) යනු අගයක් හෝ xvalue වේ.
- පැවරුම් ප්රකාශනයක දකුණු පසින් අගයන් දිස්විය හැකි බැවින්, අගයක් (ඊනියා, ically තිහාසිකව) යනු xvalue,
තාවකාලික වස්තුවක් (12.2) හෝ එහි උප විෂය හෝ
වස්තුවක් හා සම්බන්ධ නොවන අගයකි .
- ප්රව්ලියු (“පිරිසිදු” අගය) යනු xvalue නොවන rvalue වේ. [උදාහරණය: නැවත පැමිණීමේ වර්ගය
යොමු නොවන ශ්රිතයක් ඇමතීමේ ප්රති result ලය අගයක් වේ. 12, 7.3e5, හෝ
සත්ය වැනි වචනාර්ථයක වටිනාකම ද අගයක් වේ . උදාහරණයක් ලෙස]
සෑම ප්රකාශනයක්ම මෙම වර්ගීකරණයේ මූලික වර්ගීකරණයන්ගෙන් එකකට අයත් වේ: lvalue, xvalue, හෝ prvalue. ප්රකාශනයක මෙම ගුණාංගය එහි අගය කාණ්ඩය ලෙස හැඳින්වේ.
නමුත් මෙම උපවගන්තිය සංකල්ප පැහැදිලිව වටහා ගැනීමට ප්රමාණවත් යැයි මට විශ්වාස නැත, මන්ද “සාමාන්යයෙන්” ඇත්ත වශයෙන්ම සාමාන්ය නොවන අතර, “එහි ජීවිත කාලය අවසන් වන විට” සැබවින්ම කොන්ක්රීට් නොවන අතර, “වටිනාකම් යොමු කිරීම් සම්බන්ධ” ඇත්ත වශයෙන්ම පැහැදිලි නැත, සහ "උදාහරණය: ප්රතිලාභ වර්ගයක් වන අගය යොමු කිරීමක් වන ශ්රිතයක් ඇමතීමේ ප්රති x ලය xvalue වේ." සර්පයෙක් වලිගය දෂ්ට කරනවා වගේ.
ප්රාථමික වටිනාකම් කාණ්ඩ
සෑම ප්රකාශනයක්ම හරියටම එක් ප්රාථමික අගය කාණ්ඩයකට අයත් වේ. මෙම අගය කාණ්ඩ වන්නේ lvalue, xvalue සහ prvalue කාණ්ඩ වේ.
lvalues
E යන ප්රකාශය lvalue ගණයට අයත් වන්නේ නම් සහ E යන්නෙන් දැනටමත් අනන්යතාවයක් (ලිපිනය, නම හෝ අන්වර්ථය) ඇති ආයතනයක් E ට පිටතින් ප්රවේශ විය හැකි නම් පමණි.
#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
E ප්රකාශනය xvalue ගණයට අයත් වන්නේ නම් එය තිබේ නම් පමණි
- ශ්රිතයක් කැඳවීමේ ප්රති result ලය, ව්යංගයෙන් හෝ පැහැදිළිව, ආපසු පැමිණීමේ වර්ගය ආපසු ලබා දෙන වස්තු වර්ගය පිළිබඳ තක්සේරු කිරීමකි, හෝ
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;
}
- වස්තු වර්ගයට තක්සේරු අගයකට යොමු කිරීම, හෝ
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;
}
- වස්තු ප්රකාශනය xvalue එකක් වන, යොමු නොවන වර්ගයක ස්ථිතික නොවන දත්ත සාමාජිකයෙකු නම් කරන පන්ති සාමාජික ප්රවේශ ප්රකාශනය.
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 වන අතර දෙවන ඔපෙරන්ඩ් දත්ත සාමාජිකයාට දර්ශකයක් වන පොයින්ටර්-ට-සාමාජික ප්රකාශනයකි.
ඉහත නීතිරීතිවල බලපෑම නම්, වස්තූන් සඳහා නම් කරන ලද අගයන් යොමු කිරීම් අගයන් ලෙස සලකන අතර වස්තූන් සඳහා නම් නොකල තක්සේරු අගයන් xvalues ලෙස සලකනු ලැබේ; ශ්රිත පිළිබඳ rvalue යොමුව නම් කළත් නැතත් lvalues ලෙස සලකනු ලැබේ.
#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
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;
}
මිශ්ර වටිනාකම් කාණ්ඩ
තවත් වැදගත් මිශ්ර වටිනාකම් කාණ්ඩ දෙකක් තිබේ. මෙම අගය කාණ්ඩ rvalue සහ glvalue කාණ්ඩ වේ.
rvalues
E ප්රකාශනය rvalue ගණයට අයත් වන්නේ නම් E අගය xvalue ගණයට අයත් වේ නම් හෝ ප්රාව්යතා කාණ්ඩයට පමණි.
මෙම අර්ථ දැක්වීමෙන් අදහස් වන්නේ E ප්රකාශනය Rvalue ගණයට අයත් වන්නේ නම් සහ E යන්නෙන් පිටත කිසිදු ප්රවේශයක් ලබා ගත හැකි කිසිදු අනන්යතාවයක් නොමැති වස්තුවක් E යන්නෙන් අදහස් කරන්නේ නම් පමණි.
glvalues
E ප්රකාශනය ග්ලැවල් අගය ගණයට අයත් වන්නේ නම් සහ ඊ අගය lvalue ගණයට අයත් නම් හෝ xvalue කාණ්ඩයට අයත් වේ.
ප්රායෝගික නීතියක්
ස්කොට් මේයර් විසින් අගයන් අගයන්ගෙන් වෙන්කර හඳුනා ගැනීම සඳහා ඉතා ප්රයෝජනවත් රීතියක් ප්රකාශයට පත් කර ඇත .
- ඔබට ප්රකාශනයක ලිපිනය ගත හැකි නම්, ප්රකාශනය අගයකි.
- ප්රකාශනයේ වර්ගය lvalue යොමු කිරීමක් නම් (උදා: T & හෝ const T &, ආදිය), එම ප්රකාශනය අගයක් වේ.
- එසේ නොමැති නම් ප්රකාශනය අගයකි. සංකල්පමය වශයෙන් (සහ සාමාන්යයෙන් ඇත්ත වශයෙන්ම), අගයන් තාවකාලික වස්තූන් වලට අනුරූප වේ. බොහෝ වචනාර්ථ අගයන් (උදා: 10 සහ 5.3) ද අගයන් වේ.