PDA

View Full Version : سوال: ارجاع راست مقدار به یک متغیر



CPPDeveloper
پنج شنبه 05 اسفند 1389, 04:34 صبح
سلام..

من در حال خواندن یک کتاب هستم و این قطعه کد به عنوان یک مثلا برای rvalue reference آورده شده..
اما مشکل داره:


int x=5;
int&& rx = x;خطای کامپایلر هم این هست:

error C2440: 'initializing' : cannot convert from 'int' to 'int &&'داخل کتاب می گه می شود یک ارجاع راست مقدار را با یک چپ مقدار مقدار دهی کرد اما کامپایلر عکس این موضوع رو می گه، مشکل از کجاست؟

این هم متن کتاب:

You specify an rvalue reference type using two ampersands following the type name. Here ’ s an
example:
int x(5);
int & & rx = x;
The fi rst statement defi nes the variable x with the initial value 5, and the second statement defi nes
an rvalue reference, rx , that references x . This shows that you can initialize an rvalue reference
with an lvalue so it that can work just like an lvalue reference.

drstrike
جمعه 06 اسفند 1389, 12:04 عصر
کد صحیح:


int x = 5;
int &rv = x;

دوست عزیز تا جایی که یادم میاد کد شما ربطی به راست یا چپ مقدار نداره.
در کد بالا، متغیر rv یک نماینده یا نام مستعار متغیر x هست؛ یعنی هر عملیاتی رو rv اعمال شه، روی x هم اعمال می شن.به طور مثال اگه rv رو ++ کنید مقدار هر دو متغیر میشه 6.


You specify an rvalue reference type using two ampersands following the type name. Here ’ s an
example:
int x(5);
int & & rx = x;
The fi rst statement defi nes the variable x with the initial value 5, and the second statement defi nes
an rvalue reference, rx , that references x . This shows that you can initialize an rvalue reference
with an lvalue so it that can work just like an lvalue reference.

این متن از کدوم کتابه؟

CPPDeveloper
جمعه 06 اسفند 1389, 13:57 عصر
کد صحیح:


int x = 5;
int &rv = x;

دوست عزیز تا جایی که یادم میاد کد شما ربطی به راست یا چپ مقدار نداره.
در کد بالا، متغیر rv یک نماینده یا نام مستعار متغیر x هست؛ یعنی هر عملیاتی رو rv اعمال شه، روی x هم اعمال می شن.به طور مثال اگه rv رو ++ کنید مقدار هر دو متغیر میشه 6.

این متن از کدوم کتابه؟

خیلی ممنون
اما این مثال و توضیح شما رو در این کتاب به عنوان ارجاع چپ مقدار (lvalue reference ) آورده..

و متن هم از این کتابه:
Ivor Horton's beginning visual c++ 2010 (http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0470500883.html)

drstrike
جمعه 06 اسفند 1389, 16:11 عصر
ببینید من به مطلب کتاب شما کار ندارم، فقط یه توضیحی از راست مقدار و چپ مقدار میدم امیدورام بدردتون بخوره:
به طور کلی هر متغیری که در سمت راست علامت انتساب (=) قرار بگیره میشه راست مقدار و هر متغیری که در سمت چپ علامت باشه میشه چپ مقدار.مثلا:


int x = 5;

اینجا متغیر x چپ مقداره. و یا ثابت ها یک بار چپ مقدار میشن و در بقیه موارد راست مقدار.


const int Z = 12;
int y = Z;
int x = Z;

اما در مورد ارجاع: ارجاع ها برا گرفتن مقدار اولیه باید چپ مقدار شن. کد زیر رو ببینید:


int &rv = x;

نکته: برا مقدار دهی ارجاع ها سمت راست عبارت حتما باید یک راست مقدار باشه؛ یعنی نمی تونیم از عدد یا حاصل یه عبارت و ... برا راست مقدار استفاده کنیم. تمام حالات زیر اشتباه هست:


int& rv = x++;
int& rv = 5;
int& rv = x / 2;

در مورد توابع راست مقدار هم مثل کدهای بالا باهاش رفتار میشه، کد زیر:


x = max(4,5);

اما تابع چپ مقدار یه خورده فرق می کنه، فرقشم اینه که تابع چپ مقدار و باید به این صورت نوشت:


int& max(int a, int b)

مثال:


int& max(int a,int b)
{
return a > b ? a : b;
}
//***** main function ******

max(x,y) = 10;

در واقع در توابع چپ مقدار یه متغیر برگشت داده میشه!
امیدوارم بدرد خورده باشه.