মূল্য, লভালিউ, জালভ্যালু, গ্লুভ্যালু এবং মূল্যগুলি কী কী?


1355

সি ++ 03 এ, একটি এক্সপ্রেশন হ'ল মূল্য বা লভ্যালু

সি ++ 11 এ, একটি এক্সপ্রেশন হতে পারে:

  1. rvalue
  2. lvalue
  3. xvalue
  4. glvalue
  5. prvalue

দুটি বিভাগ পাঁচটি বিভাগে পরিণত হয়েছে।

  • এক্সপ্রেশন এই নতুন বিভাগ কি?
  • এই নতুন বিভাগগুলি কীভাবে বিদ্যমান মূল্যায়ন এবং মূল্যবান বিভাগগুলির সাথে সম্পর্কিত?
  • সি ++ 0x এ মূল্যবোধ এবং মূল্যমানের বিভাগগুলি কি সি ++ 03 তে রয়েছে?
  • এই নতুন বিভাগগুলির প্রয়োজন কেন? করছেন WG21 দেবতাদের শুধু আমাদের নিছক মানুষ গুলান বের করার চেষ্টা?

9
ফিলিপ পটার: সি ++ 03 এ? হ্যাঁ. একটি ল্যাভেলুটি একটি মূল্য হিসাবে ব্যবহৃত হতে পারে কারণ একটি মান লভালু-থেকে-মূল্যমান রূপান্তর রয়েছে।
জেমস ম্যাকনেলিস

14
@ টাইলার: "আপনি যদি এটি নির্ধারণ করতে পারেন তবে এটি একটি মূল্যবান, অন্যথায়, এটি একটি মূল্য val" -> ভুল, তুমি ক্লাসে rvalues নির্ধারিত করতে পারেন: string("hello") = string("world")
ফ্রেডওভারফ্লো

4
নোট করুন যে এটি মান বিভাগ। এক্সপ্রেশন থাকতে পারে আরও বৈশিষ্ট্য আছে। এর মধ্যে বিট-ফিল্ড (সত্য / মিথ্যা), অস্থায়ী (সত্য / মিথ্যা) এবং টাইপ (এটির ধরণ) অন্তর্ভুক্ত রয়েছে।
জোহানেস স্কাউব -

30
আমি মনে করি ফ্রেডের লিঙ্কটি এখানে যে কোনও উত্তরের চেয়ে ভাল। যদিও লিঙ্কটি মারা গেছে। এটি স্থানান্তরিত হয়েছিল: stroustrup.com/terminology.pdf
আর মার্টিনহো ফার্নান্দেস

74
সি ++ তে এমনকি আপনার প্রকারেরও প্রকারভেদ রয়েছে
nielsbot

উত্তর:


634

আমার ধারণা এই নথিটি খুব কম সংক্ষিপ্ত ভূমিকা হিসাবে পরিবেশন করতে পারে: n3055

পুরো গণহত্যার পদক্ষেপটি শব্দচূড়া দিয়ে শুরু হয়েছিল। একবার আমাদের মত প্রকাশ হয় যা সরানো যায় এবং অনুলিপি করা যায় না, হঠাৎ করেই নিয়মগুলি সহজেই উপলব্ধি করা সহজ হয়ে যায় এমন অভিব্যক্তিগুলির মধ্যে পার্থক্য দাবি করে এবং কোন দিকে which

খসড়াটির উপর ভিত্তি করে আমার অনুমান যা থেকে, r / l মানের পার্থক্য একই থাকে, কেবল চলমান বিষয়গুলি অগোছালো হয়ে যায় context

তাদের কি দরকার? সম্ভবত আমরা নতুন বৈশিষ্ট্যগুলি হারাতে চাই না তবে not তবে আরও ভাল অপ্টিমাইজেশনের অনুমতি দেওয়ার জন্য আমাদের সম্ভবত তাদের আলিঙ্গন করা উচিত।

উদ্ধৃতি N3055 :

  • একটি ল্যাভেলু (তথাকথিত, historতিহাসিকভাবে, কারণ লভ্যালুগুলি একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটির বাম দিকে প্রদর্শিত হতে পারে) একটি ফাংশন বা কোনও অবজেক্টকে নির্ধারণ করে। [উদাহরণস্বরূপ: যদি Eপয়েন্টার ধরণের *E অভিব্যক্তি হয় তবে অবজেক্ট বা ফাংশনকে নির্দেশ করে এমন একটি মূল্যবান এক্সপ্রেশন E । অন্য উদাহরণ হিসাবে, কোনও ফাংশন কল করার ফলাফল যার রিটার্নের ধরণটি লভ্যালু রেফারেন্সটি একটি লভ্যালু]
  • একটি জালভ্যালু (একটি "এক্স্পায়ারিং" মান) একটি বস্তুকেও বোঝায়, সাধারণত তার জীবদ্দশার শেষের কাছে (যাতে এর উত্সগুলি সরানো যেতে পারে, উদাহরণস্বরূপ)। একটি জালভ্যালু হ'ল মূল ধরণের রেফারেন্সগুলিতে জড়িত কিছু ধরণের অভিব্যক্তির ফলাফল। [উদাহরণস্বরূপ: কোনও ফাংশনকে কল করার ফলাফল যাঁর ফেরতের প্রকারটি মূল্যের রেফারেন্সটি একটি মূল্যমান]
  • একটি গ্লাভ ("জেনারালাইজড" লভালু) হল একটি লভ্যালু বা একটি xvalue
  • একটি মূল্য (তথাকথিত, icallyতিহাসিকভাবে, কারণ মূল্য নির্ধারিত একটি এক্সপ্রেশন অভিব্যক্তির ডান দিকে প্রদর্শিত হতে পারে) হল একটি মূল্য, একটি অস্থায়ী বস্তু বা এর সাবোবজেক্ট বা কোনও মান যা কোনও বস্তুর সাথে সম্পর্কিত নয়।
  • একটি মূল্য ("খাঁটি" মূল্য) একটি মূল্য যা কোনও মূল্য নয়। [উদাহরণস্বরূপ: কোনও ফাংশন কল করার ফলাফল যাঁর রিটার্নের ধরণটি প্রসঙ্গ নয়)

প্রশ্নে থাকা দস্তাবেজটি এই প্রশ্নের জন্য একটি দুর্দান্ত রেফারেন্স, কারণ এটি নতুন নামকরণের প্রবর্তনের ফলে ঘটেছে এমন মানদণ্ডে সঠিক পরিবর্তনগুলি দেখায়।


ধন্যবাদ, এই উত্তরটি সত্যিই সহায়ক! তবে আমার সংকলক xvalue এবং মূল্যগুলির জন্য আপনার উদাহরণগুলির সাথে একমত নয়; তারা ঠিক বিপরীত। মূল্যসূচক রেফারেন্স দিয়ে ফিরে আসা আমাকে একটি মূল্য দেয় এবং মান দ্বারা প্রত্যাবর্তন আমাকে একটি মূল্য দেয়। আপনি কি তাদের মিশ্রিত করেছেন, বা আমার পরীক্ষার বিছানা নষ্ট হয়েছে? আমি এটি জিসিসি 4.6.1, ঝনঝন (এসএনএন থেকে) এবং এমএসভিসির মাধ্যমে চেষ্টা করেছি এবং তারা সকলেই একই আচরণ দেখায়।
কিম গ্রোসমান

ওফস, আমি কেবল লিঙ্কটি অনুসরণ করেছি এবং লক্ষ্য করেছি যে উত্সগুলিতে উদাহরণগুলি রয়েছে। আমি আমার স্ট্যান্ডার্ডের অনুলিপিটি খুঁজে যাব এবং এটি কী বলেছে তা যাচাই করে
নেব

4
আমি বিভিন্ন অভিব্যক্তি পরীক্ষা করার জন্য এখান থেকে ম্যাক্রোগুলি ব্যবহার করি: stackoverflow.com/a/6114546/96963 এটি হতে পারে যে তারা জিনিসগুলি ভুল করে নির্ণয় করতে পারে।
কিম গ্রোসমান

1
এক্সভ্যালু যুক্ত করা মুভ সিমান্টিক্সের জন্য নয়। কেবলমাত্র মূল্য এবং মূল্য উভয়ই দিয়ে মুভ শব্দার্থবিজ্ঞান, নিখুঁত ফরোয়ার্ড এবং মূল্যমানের রেফারেন্স এখনও ভাল কাজ করছে। আমি মনে করি যে xvalue কেবলমাত্র ডিক্লাইপ অপারেটরের জন্য: যদি অপারেন্ড এক্সপ্রেশনটি xvalue হয় তবে ডিক্লাইপটি প্রকারের রেফারেন্সের ধরণ দেয়।
ligand

1
@ মুহম্মদিকাক "" প্রতিটি অভিব্যক্তি হয় একটি মূল্য বা একটি মূল্য ": এটি সত্য; এবং স্ট্যান্ডার্ড (বা ডকুমেন্ট এন 3055) এটি মিথ্যা বলে না। এই বাক্যটি অতিক্রম করার কারণটি হ'ল আপনি নথির দুটি সংস্করণের মধ্যে পরিবর্তনগুলি দেখছিলেন। বাক্যটি সরানো হয়েছে কারণ আরও সুনির্দিষ্ট ব্যাখ্যা যুক্ত হওয়ার পরে এটি অতিরিক্ত অতিরিক্ত হয়ে উঠেছে।
সর্বাধিক

337

এক্সপ্রেশন এই নতুন বিভাগ কি?

FCD (n3092) একটি চমৎকার বিবরণ রয়েছে:

- একটি মূল্য (ueতিহাসিকভাবে বলা হয়, কারণ একটি অ্যাসাইনমেন্ট এক্সপ্রেশনটির বাম দিকে ল্যাভেলুগুলি উপস্থিত হতে পারে) কোনও ফাংশন বা কোনও অবজেক্টকে নির্ধারণ করে। [উদাহরণস্বরূপ: যদি E পয়েন্টার ধরণের একটি এক্সপ্রেশন হয়, তবে * E হল একটি মূল্যমানের বহিঃপ্রকাশ যা সেই অবজেক্ট বা ফাংশনকে বোঝায় যা ই পয়েন্ট করে। অন্য উদাহরণ হিসাবে, কোনও ফাংশন কল করার ফলাফল যার রিটার্ন টাইপ একটি লভ্যালু রেফারেন্স হয় একটি লভ্যালু। পরবর্তী উদাহরণ]

- একটি এক্সাল্যু (একটি "এক্স্পায়ারিং" মান) সাধারণত কোনও বস্তু বোঝায় যা সাধারণত তার জীবদ্দশার শেষের কাছাকাছি থাকে (যাতে এটির সংস্থানগুলি সরানো যেতে পারে, উদাহরণস্বরূপ)। একটি জালভ্যালু হ'ল মূল ধরণের রেফারেন্স (8.3.2) জড়িত কিছু ধরণের অভিব্যক্তির ফলাফল। [উদাহরণস্বরূপ: কোনও ফাংশনকে কল করার ফলাফল যাঁর রিটার্ন টাইপটি মূল্যের রেফারেন্স হয় তা হল একটি মূল্য। পরবর্তী উদাহরণ]

- একটি গ্লুভ ("জেনারালাইজড" লভালু) হল একটি লভ্যালু বা এক্সাল্যু।

- একটি মূল্য (calledতিহাসিকভাবে বলা হয়, কারণ অ্যাসাইনমেন্ট এক্সপ্রেশনগুলির ডানদিকে মূল্যবোধগুলি উপস্থিত হতে পারে) একটি মূল্যমান, একটি অস্থায়ী বস্তু (12.2) বা এর সাবোবজেক্ট বা কোনও মান যা কোনও বস্তুর সাথে সম্পর্কিত নয়।

- একটি মূল্য ("খাঁটি" মূল্য) একটি মূল্য যা কোনও মূল্য নয়। [উদাহরণস্বরূপ: কোনও ফাংশন কল করার ফলাফল যাঁর রিটার্নের ধরণটি প্রসঙ্গ নয় a আক্ষরিকের যেমন 12, 7.3e5 বা সত্যের মানও একটি মূল্য val পরবর্তী উদাহরণ]

প্রতিটি অভিব্যক্তি এই শ্রেণীবিন্যাসের ঠিক একটি মৌলিক শ্রেণিবিন্যাসের অন্তর্ভুক্ত: লভ্যালু, জালভ্যালু বা মূল্য, একটি অভিব্যক্তির এই সম্পত্তিটিকে এর মান বিভাগ বলা হয়। [দ্রষ্টব্য: ক্লজ 5 এ প্রতিটি অন্তর্নির্মিত অপারেটরের আলোচনার দ্বারা এটির যে মূল্য দেয় সেটি এবং এটি যে অপারেন্টগুলির মান বিভাগগুলি প্রত্যাশা করে তা নির্দেশ করে। উদাহরণস্বরূপ, বিল্ট-ইন অ্যাসাইনমেন্ট অপারেটররা আশা করে যে বাম অপারেন্ডটি একটি লভ্যালু এবং ডান অপারেন্ডটি একটি মূল্য রয়েছে এবং ফলস্বরূপ একটি মূল্য অর্জন করে yield ব্যবহারকারী-সংজ্ঞায়িত অপারেটরগুলি হ'ল ফাংশন এবং মান এবং তারা প্রত্যাশা করে এবং ফলনের মানগুলি তাদের প্যারামিটার এবং রিটার্নের ধরণের দ্বারা নির্ধারিত হয়। নোট

আমি আপনাকে পুরো বিভাগটি পড়ার পরামর্শ দিচ্ছি 3.10 যদিও মূল্য এবং মূল্যগুলি

এই নতুন বিভাগগুলি কীভাবে বিদ্যমান মূল্যায়ন এবং মূল্যবান বিভাগগুলির সাথে সম্পর্কিত?

আবার

বর্গীকরণ সূত্র

সি ++ 0x এ মূল্যবোধ এবং মূল্যমানের বিভাগগুলি কি সি ++ 03 তে রয়েছে?

মুদ্রণ শব্দার্থের শব্দার্থবিজ্ঞান বিশেষত সরানো শব্দার্থবিজ্ঞানের প্রবর্তনের সাথে বিকশিত হয়েছে।

এই নতুন বিভাগগুলির প্রয়োজন কেন?

যাতে পদক্ষেপ নির্মাণ / কার্যনির্বাহিত সংজ্ঞায়িত এবং সমর্থিত হতে পারে।


54
আমি এখানে চিত্রটি পছন্দ করি। আমি মনে করি উত্তরটি দিয়ে শুরু করা কার্যকর হতে পারে "প্রতিটি অভিব্যক্তি এই শ্রেণীবিন্যাসের একমাত্র মৌলিক শ্রেণিবিন্যাসের অন্তর্ভুক্ত: লভালিউ, জালভ্যালু, বা মূল্য।" তারপরে ডায়াগ্রামটি ব্যবহার করা সহজ val তিনটি মৌলিক শ্রেণিকে একত্রিত করে গ্লাভ এবং মূল্যকে তৈরি করতে দেখানো হয়েছে।
অ্যারন ম্যাকডেইড

2
"গ্লুভ্যালু" "সমান নয়" এর সমতুল্য, এবং "মূল্যায়ন" "সমান নয়" সমান।
ভ্লাদিমির রেশেটনিকভ

2
এটি আমাকে সবচেয়ে বেশি সাহায্য করেছে: বজামিরসিয়া.github.io/assets/2016-04-07- সরু-ফরওয়ার্ড/… (মান বিভাগের ভেন চিত্র)
জন পি

1
@AaronMcDaid হাই, দ্রুত প্রশ্ন আপনি / কেউ উত্তর দিতে পারেন ... কেন নাম glvalueহিসাবে lvalueএবং lvalueহিসাবে plvalue, সামঞ্জস্যপূর্ণ হতে হবে?
বিজয় চাওদা

184

আমি আপনার শেষ প্রশ্ন দিয়ে শুরু করব:

এই নতুন বিভাগগুলির প্রয়োজন কেন?

সি ++ স্ট্যান্ডার্ডে এমন অনেকগুলি বিধি থাকে যা অভিব্যক্তির মান বিভাগের সাথে সম্পর্কিত। কিছু বিধি লভ্যালু এবং মূল্যগুলির মধ্যে পার্থক্য তৈরি করে। উদাহরণস্বরূপ, যখন এটি ওভারলোড রেজোলিউশন আসে। অন্যান্য নিয়মগুলি আঠালো এবং মূল্যগুলির মধ্যে পার্থক্য তৈরি করে। উদাহরণস্বরূপ, আপনার অসম্পূর্ণ বা বিমূর্ত আকারের একটি গ্লাভ্যু থাকতে পারে তবে অসম্পূর্ণ বা বিমূর্ত প্রকারের কোনও মূল্য নেই। আমাদের এই পরিভাষাটি থাকার আগে যে নিয়মগুলি আসলে গ্লুভ / প্রলিউয়ের মধ্যে লভ্যালু / মূল্যকে উল্লেখ করা হত তার মধ্যে পার্থক্য করা দরকার এবং সেগুলি অনিচ্ছাকৃতভাবে ভুল ছিল বা নিয়মে একটি লা "এর প্রচুর ব্যাখ্যা এবং ব্যতিক্রম ছিল ... যদি না এই নামটি অজ্ঞাতনামা কারণে হয় মূল্যসূচক রেফারেন্স ... "। সুতরাং, কেবল গ্লাভু এবং ধারণাগুলি তাদের নিজস্ব নাম দেওয়া ভাল ধারণা বলে মনে হচ্ছে।

এক্সপ্রেশন এই নতুন বিভাগ কি? এই নতুন বিভাগগুলি কীভাবে বিদ্যমান মূল্যায়ন এবং মূল্যবান বিভাগগুলির সাথে সম্পর্কিত?

আমাদের কাছে এখনও লভালু এবং মূল্যগুলি পদ রয়েছে যা সি ++ 98 এর সাথে সামঞ্জস্যপূর্ণ। আমরা মাত্র দু'টি উপগোষ্ঠী, জালভ্যালু এবং মূল্যকে বিভক্ত করেছিলাম এবং আমরা লভালিউস এবং জালভ্যাকে গ্লুভ্যুলু হিসাবে উল্লেখ করি। নামবিহীন মূল্যবোধের রেফারেন্সগুলির জন্য এক্সভালিউস একটি নতুন ধরণের মান বিভাগ। প্রতিটি অভিব্যক্তি এই তিনটির মধ্যে একটি: লভ্যালু, জালভ্যালু, মূল্য। একটি ভেন চিত্রটি দেখতে এই রকম হবে:

    ______ ______
   /      X      \
  /      / \      \
 |   l  | x |  pr  |
  \      \ /      /
   \______X______/
       gl    r

ফাংশন সহ উদাহরণ:

int   prvalue();
int&  lvalue();
int&& xvalue();

তবে এটিও ভুলে যাবেন না যে নামযুক্ত মূলসূত্রগুলি উল্লেখগুলি হ'ল:

void foo(int&& t) {
  // t is initialized with an rvalue expression
  // but is actually an lvalue expression itself
}

165

এই নতুন বিভাগগুলির প্রয়োজন কেন? ডাব্লুজি 21 দেবতা কি কেবল নিছক মানুষকে বিভ্রান্ত করার চেষ্টা করছেন?

আমি মনে করি না যে অন্যান্য উত্তরগুলি (যদিও তাদের মধ্যে অনেকগুলিই ভাল) সত্যিই এই নির্দিষ্ট প্রশ্নের উত্তর ক্যাপচার করে। হ্যাঁ, শব্দার্থবিজ্ঞানের স্থান পরিবর্তন করতে এই বিভাগগুলি এবং এ জাতীয় উপস্থিতি রয়েছে, তবে জটিলতা একটি কারণে রয়েছে। এটি সি ++ 11 এ স্টাফ সরানোর এক অদম্য নিয়ম:

আপনি কেবল তখনই সরে যাবেন যখন এটি করা নিঃসন্দেহে নিরাপদ।

এই কারণেই এই বিভাগগুলি বিদ্যমান: সেগুলি থেকে সরানো নিরাপদ যেখানে মানগুলি সম্পর্কে কথা বলতে সক্ষম হওয়া এবং এটি যেখানে নেই সেখানে মান সম্পর্কে কথা বলতে।

আর-মান উল্লেখের প্রথম সংস্করণে চলাচলটি খুব সহজেই ঘটেছিল। খুব সহজেই। সহজেই যথেষ্ট যে ব্যবহারকারী যখন প্রকৃতপক্ষে বোঝাতে চাইছিল না তখন স্পষ্টতই চলমান জিনিসগুলির জন্য প্রচুর সম্ভাবনা ছিল।

এখানে এমন পরিস্থিতিতে রয়েছে যেগুলির অধীনে কোনও কিছু স্থানান্তরিত করা নিরাপদ:

  1. এটি যখন কোনও অস্থায়ী বা সাবোবজেক্ট হয়। (Prvalue)
  2. যখন ব্যবহারকারী স্পষ্টভাবে এটি সরানোর জন্য বলেছে

আপনি যদি এটি করেন:

SomeType &&Func() { ... }

SomeType &&val = Func();
SomeType otherVal{val};

এটি কি করে? অনুমানের পুরানো সংস্করণগুলিতে, 5 টি মান আসার আগে, এটি একটি পদক্ষেপকে উত্সাহিত করবে। অবশ্যই আছে। আপনি কন্সট্রাক্টরকে একটি মূল মূল্য রেফারেন্স দিয়ে গেছেন, এবং এইভাবে এটি নির্মাণকারীর সাথে আবদ্ধ হয় যা একটি মূল্যবান রেফারেন্স নেয়। এটা সুস্পষ্ট।

এটির সাথে একটি মাত্র সমস্যা আছে; তুমি না জিজ্ঞাসা এটিকে সরান। ওহ, আপনি বলতে &&পারেন যে এটির একটি সূত্র হওয়া উচিত ছিল, তবে এটি নিয়মটি ভেঙে ফেলেছে তা সত্য নয়। valঅস্থায়ী নয় কারণ অস্থায়ীদের নাম নেই। আপনি হয়ত অস্থায়ী জীবনকাল বাড়িয়ে দিয়েছেন, তবে এর অর্থ এটি অস্থায়ী নয় ; এটি ঠিক অন্য কোনও স্ট্যাক ভেরিয়েবলের মতো।

যদি এটি অস্থায়ী না হয় এবং আপনি এটিকে সরিয়ে নিতে বলেন না, তবে সরানো ভুল।

সুস্পষ্ট সমাধান হ'ল valএকটি মূল্য তৈরি করা। এর অর্থ হল আপনি এটি থেকে সরাতে পারবেন না। আচ্ছা ঠিক আছে; এটি এর নাম, তাই এটি একটি মূল্য।

একবার আপনি এটি করার পরে, আপনি আর বলতে পারবেন না যে এর SomeType&&অর্থ সর্বত্র একই জিনিস। আপনি এখন নামযুক্ত মূল্যায়ন রেফারেন্স এবং নামবিহীন মূল্যবোধের রেফারেন্সের মধ্যে একটি পার্থক্য তৈরি করেছেন। ভাল, নামযুক্ত মূল্যসূত্র উল্লেখগুলি হ'ল মূল্য; ওপরে আমাদের সমাধান ছিল। সুতরাং আমরা নামবিহীন মূল্যবোধের রেফারেন্সগুলিকে কী বলি (এর থেকে ফেরতের মানFunc উপরে ) কী ?

এটি কোনও মূল্য নয়, কারণ আপনি একটি মূল্যবান স্থান থেকে সরাতে পারবেন না। এবং আমরা প্রয়োজন একটি ফিরতি দ্বারা সরাতে পাবে &&; অন্য কিছু আপনি স্পষ্টভাবে কিছু সরানো বলতে পারেন? std::moveসর্বোপরি এটাই প্রত্যাবর্তন। এটি কোনও মূল্য (পুরানো শৈলী) নয়, কারণ এটি কোনও সমীকরণের বাম দিকে হতে পারে (জিনিসগুলি আসলে কিছুটা জটিল, এই প্রশ্নটি এবং নীচের মন্তব্যগুলি দেখুন)। এটি কোন মূল্য বা মূল্য নয়; এটি একটি নতুন ধরণের জিনিস।

আমাদের যা আছে তা হ'ল একটি মান যা আপনি লভালিউ হিসাবে বিবেচনা করতে পারেন, এটি বাদে স্পষ্টতই চলনযোগ্য । আমরা এটিকে একটি xvalue বলি।

নোট করুন যে এক্সভ্যালুগুলি হ'ল যা আমাদের অন্যান্য দুটি বিভাগের মান অর্জন করে:

  • পূর্বমূল্যটি হ'ল পূর্বের ধরণের মূল্যবোধের কেবলমাত্র নতুন নাম, অর্থাত্ তারা মূল্যবোধগুলি নয় যেগুলি মূল্য নয়

  • গ্লাভলুগুলি হ'ল এক গ্রুপের জ্যাভালিউস এবং লভ্যালুগুলির মিলন, কারণ তারা প্রচুর পরিমাণে সম্পত্তি ভাগ করে।

সুতরাং প্রকৃতপক্ষে, এগুলি সবগুলি এক্সভালিউজে নেমে আসে এবং চলাফেরাকে ঠিক এবং কেবল নির্দিষ্ট জায়গায় সীমাবদ্ধ করার প্রয়োজন। এই জায়গাগুলি মূল মূল্য বিভাগ দ্বারা সংজ্ঞায়িত করা হয়; মূল্যগুলি হ'ল অন্তর্নিহিত পদক্ষেপ এবং এক্সভালিউস হ'ল সুস্পষ্ট চলন ( std::moveএকটি এক্সাল্যু রিটার্ন দেয়)।


11
@ থমাস: এটি একটি উদাহরণ; এটি কীভাবে রিটার্নের মান তৈরি করে তা বিবেচ্য নয়। কী গুরুত্বপূর্ণ তা এটি একটি &&
নিকোল বোলাস

1
দ্রষ্টব্য: মূল্যবৃদ্ধিগুলি কোনও সমীকরণের বাম দিকে থাকতে পারে - যেমনটিও X foo(); foo() = X;... এই মৌলিক কারণে, আমি শেষ পর্যন্ত উপরের চমৎকার উত্তরের অনুসরণ করতে পারি না, কারণ আপনি কেবলমাত্র এর মধ্যে পার্থক্য তৈরি করেছেন নতুন xvalue এবং পুরাতন স্টাইলের মূল্য, এটি lhs- এ থাকতে পারে based
ড্যান নিসেনবাউম

1
Xএকটি শ্রেণি হচ্ছে; X foo();একটি ফাংশন ঘোষণা, এবং foo() = X();কোড একটি লাইন হচ্ছে। (আমি প্রথম বন্ধনী দ্বিতীয় সেট বন্ধ করেছিলাম সেখান থেকে foo() = X();আমার উপরে মন্তব্যে।) একটি প্রশ্ন আমি শুধু এই ব্যবহারের সঙ্গে পোস্ট হাইলাইট জন্য, দেখুন stackoverflow.com/questions/15482508/...
ড্যান Nissenbaum

1
@ ড্যানিসিসনবাউম "অ্যাসাইনমেন্ট এক্সপ্রেশন-এর বাম পাশে থাকতে পারে না" - কেন নয়? দেখুন ideone.com/wyrxiT
মিখাইল

1
আলোকিত উত্তর। এটি নিঃসন্দেহে এখানে সেরা উত্তর। এটি আমাকে নতুন মান বিভাগগুলি এবং তার আগে কী হয়েছিল তা প্রবর্তনের যুক্তি দিয়েছিল।
নিকস

136

আইএমএইচও, এর অর্থ সম্পর্কে সর্বোত্তম ব্যাখ্যা আমাদেরকে স্ট্রস্ট্রপ দিয়েছে + ডানিয়েল স্যান্ডর এবং মোহন এর উদাহরণ বিবেচনা করে :

স্ট্রোভস্ট্রুপের:

এখন আমি মারাত্মকভাবে উদ্বিগ্ন ছিলাম। স্পষ্টতই আমরা একটি অচলাবস্থা বা জগাখিচুড়ি বা উভয়ের পক্ষে যাচ্ছিলাম। মধ্যাহ্নভোজনে কোন বৈশিষ্ট্য (মানগুলির) স্বতন্ত্র ছিল তা দেখার জন্য বিশ্লেষণ করে কাটিয়েছি। দুটি মাত্র স্বতন্ত্র সম্পত্তি ছিল:

  • has identity - যেমন এবং ঠিকানা, একটি পয়েন্টার, ব্যবহারকারী নির্ধারণ করতে পারে যে দুটি অনুলিপি অভিন্ন কিনা ইত্যাদি
  • can be moved from - যেমন আমাদের কিছু অনির্দিষ্ট, তবে বৈধ অবস্থায় "অনুলিপি" উত্সে যেতে দেওয়া হয়

এটি আমাকে এই সিদ্ধান্তে নিয়ে গেছে যে ঠিক তিন প্রকারের মান রয়েছে (একটি নেতিবাচক ইঙ্গিত দেওয়ার জন্য মূলধন বর্ণটি ব্যবহারের রেজেক্স নোটেশনাল ট্রিক ব্যবহার করে - আমি হতাশায় ছিলাম):

  • iM: পরিচয় আছে এবং এখান থেকে সরানো যায় না
  • im: পরিচয় রয়েছে এবং এ থেকে সরানো যেতে পারে (উদাঃ একটি মূল্যকে রেলেয়ু রেফারেন্সে ফেলে দেওয়ার ফলস্বরূপ)
  • Im: পরিচয় নেই এবং এখান থেকে সরানো যেতে পারে।

    চতুর্থ সম্ভাবনা, IM((পরিচয় নেই এবং সরানো যায় না C++)) অন্য কোনও ভাষায় (বা, আমার মনে হয়) কার্যকর নয়।

মানগুলির এই তিনটি মৌলিক শ্রেণিবিন্যাস ছাড়াও, আমাদের দুটি সুস্পষ্ট সাধারণীকরণ রয়েছে যা দুটি স্বতন্ত্র বৈশিষ্ট্যের সাথে মিলে যায়:

  • i: পরিচয় আছে
  • m: থেকে সরানো যেতে পারে

এটি আমাকে এই চিত্রটি বোর্ডে স্থাপন করতে পরিচালিত করেছিল: এখানে চিত্র বর্ণনা লিখুন

নামকরণ

আমি পালন যে আমরা কেবল নাম স্বাধীনতা সীমিত: বামে (লেবেল থেকে দুই পয়েন্ট iMএবং iবেশী বা কম আনুষ্ঠানিকতা ব্যক্তিদের কি বলা আছে) lvaluesএবং অধিকার (লেবেল উপর দুই পয়েন্ট mএবং Im) কী বেশী বা কম আনুষ্ঠানিকতা ব্যক্তিদের ডেকেছে rvalues। এটি অবশ্যই আমাদের নামকরণে প্রতিফলিত হবে। এটি হ'ল, বাম "লেগ" এর Wসাথে সম্পর্কিত নাম থাকতে হবে lvalueএবং ডানের "লেগ" এর Wসাথে সম্পর্কিত নাম থাকতে হবে rvalue.আমি নোট করছি যে এই পুরো আলোচনা / সমস্যাটি মূল্যের রেফারেন্স এবং মুভমেন্ট শব্দার্থ সূচনার প্রবর্তন থেকেই উদ্ভূত হয়েছে। এই ধারণাগুলি স্ট্রেচের জগতে ন্যায়সঙ্গত rvaluesএবং এর সমন্বয়ে কেবল বিদ্যমান নেই lvalues। কেউ পর্যবেক্ষণ করেছেন যে ধারণা

  • প্রতিটি valueহয় হয় একটি lvalueবা একটিrvalue
  • একটি lvalueএকটি rvalueএবং একটি rvalueহয় নাlvalue

গভীরভাবে আমাদের চেতনাতে এম্বেড করা হয়েছে, খুব দরকারী বৈশিষ্ট্য, এবং এই দ্বৈতত্ত্বের চিহ্নগুলি খসড়া মানক জুড়ে পাওয়া যায়। আমরা সকলেই একমত হয়েছি যে আমাদের সেই সম্পত্তিগুলি সংরক্ষণ করতে হবে (এবং সেগুলি সুনির্দিষ্ট করে তুলতে হবে)। এটি আমাদের নামকরণের পছন্দগুলিকে আরও বাধা দেয়। আমি পর্যবেক্ষণ করেছি যে স্ট্যান্ডার্ড লাইব্রেরি শব্দটির rvalueঅর্থ m(জেনারালাইজেশন) বোঝায় , যাতে আদর্শ গ্রন্থাগারের প্রত্যাশা এবং পাঠ্য সংরক্ষণের জন্য ডানদিকের নীচের অংশটির Wনাম রাখা উচিত rvalue.

এটি নামকরণের উপর দৃষ্টি নিবদ্ধ করে আলোচনার দিকে পরিচালিত করে। প্রথমত, আমরা সিদ্ধান্ত নেওয়ার প্রয়োজন lvalue.উচিত lvalueগড় iMবা সাধারণীকরণ i? ডগ গ্রেগোরের নেতৃত্বে আমরা মূল ভাষাটির শব্দাবলীর সেই জায়গাগুলি তালিকাভুক্ত করেছি যেখানে শব্দটি একে অপরটির lvalueঅর্থ বোঝাতে সক্ষম হয়েছিল। একটি তালিকা তৈরি করা হয়েছিল এবং বেশিরভাগ ক্ষেত্রে এবং lvalueবর্তমানে সবচেয়ে কৌশলযুক্ত / ভঙ্গুর পাঠ্যটির অর্থ iM। এটি ল্যাভালুটির শাস্ত্রীয় অর্থ কারণ "পুরানো দিনগুলিতে" কিছুই সরানো হয়নি; moveএকটি উপন্যাস ধারণা C++0x। এছাড়াও, শীর্ষের বাম বিন্দু নামকরণ W lvalueআমাদের সম্পত্তি দেয় যা প্রতিটি মান একটি lvalueবা একটি rvalue, তবে উভয়ই নয়।

সুতরাং, শীর্ষ বিন্দু বাম এর Wহয় lvalueএবং নীচের অংশে ডানদিকে বিন্দু হয় rvalue.কি যে নীচে বাঁদিকের এরপর উপরের ডান পয়েন্ট করতে না? নীচের বামদিকটি হ'ল ধ্রুপদী দামের একটি সাধারণীকরণ, যা চলার অনুমতি দেয়। সুতরাং এটি একটি generalized lvalue.নাম হিসাবে এটি glvalue.সংক্ষিপ্তসার সম্পর্কে আপনি quibble করতে পারেন, কিন্তু (আমি মনে করি) যুক্তি দিয়ে না। আমরা ধরে নিয়েছি যে গুরুতর ব্যবহারে generalized lvalue যে কোনওভাবে সংক্ষিপ্তসার হবে, তাই আমাদের তাৎক্ষণিকভাবে এটি করা (বা ঝুঁকি বিভ্রান্তি) ছিল। ডাব্লু এর ডানদিকের পয়েন্টটি নীচের ডানদিকের চেয়ে কম সাধারণ (এখনকার মতো, বলা হয় rvalue)। এই বিন্দুটি আপনি যে স্থান থেকে সরতে পারেন তার আসল শুদ্ধ ধারণা উপস্থাপন করে কারণ এটি আবার উল্লেখ করা যায় না (কোনও ডেস্ট্রাস্টার ব্যতীত)। আমি specialized rvalueএর বিপরীতে বাক্যাংশটি পছন্দ করেছিgeneralized lvalue কিন্তুpure rvalueসংক্ষিপ্ত হয়েছেprvalueজিতেছে (এবং সম্ভবত ঠিক তাই)। সুতরাং, ডাব্লু এর বাম পা হয় lvalueএবং glvalueএবং ডান পা হয় prvalueএবংrvalue. উল্লেখ্য, যে মান কোনো glvalue বা prvalue, তবে দুটো একসাথে নয়।

এই পাতার উপরের মধ্যম W: im; এটি হ'ল মানগুলি যা পরিচয় রাখে এবং সরানো যায়। আমাদের কাছে সত্যিকার অর্থে এমন কিছু নেই যা সেই otতিহ্যবাহী প্রাণীদের জন্য একটি ভাল নামে আমাদের গাইড করে। স্ট্যান্ডার্ড পাঠ্য (খসড়া) দিয়ে কাজ করা লোকদের কাছে এগুলি গুরুত্বপূর্ণ, তবে পরিবারের কোনও নাম হওয়ার সম্ভাবনা নেই। আমাদের গাইড করার জন্য নামকরণে আমরা কোনও আসল প্রতিবন্ধকতা খুঁজে পাইনি, তাই আমরা কেন্দ্রের জন্য 'এক্স' বেছে নিয়েছি, অজানা, অদ্ভুত, কেবল এক্সপার্ট বা এমনকি এক্স রেটেড।

স্টিভ চূড়ান্ত পণ্য দেখাচ্ছে


14
হ্যাঁ, স্ট্যান্ডার্ডের চেয়ে মূল প্রস্তাবগুলি এবং সি ++ কমিটির আলোচনাগুলি পড়া ভাল, যদি আপনি বুঝতে চান তবে তাদের অর্থ কী: ডি
ইভান কুশ

8
সাহিত্যের পরিচয় নেই এবং এখান থেকে সরানো যায় না; তারা তবুও দরকারী।
ড্রিপজ্জা

আমি শুধু একটি বিষয় স্পষ্ট করতে চাই। int && f () {ফেরত 1; } এবং মাইক্লাস && g () My MyClass () ফেরত দেয়; x ফিরুন xvalue, তাই না? তারপরে আমি f () এর এক্সপ্রেশনগুলির পরিচয় কোথায় খুঁজে পাব; এবং জি();"? তাদের পরিচয় আছে, কারণ রিটার্নের বিবৃতিতে আরও একটি অভিব্যক্তি রয়েছে, যা তারা উল্লিখিত একই বস্তুকে বোঝায় - আমি কি এটি সঠিক বুঝতে পারি?
ডানিয়েল স্যান্ডর

6
@ ডিআর পিজ্জা স্ট্যান্ডার্ড অনুসারে: স্ট্রিং লিটারেল lvalueগুলি এস, অন্যান্য সমস্ত লিটারাল prvalueএস। কঠোরভাবে বলতে গেলে আপনি নন-স্ট্রিং লিটারালগুলি অস্থাবর হওয়া উচিত বলার পক্ষে যুক্তি তুলতে পারেন, তবে মানটি কীভাবে লেখা হয় তা নয়।
ব্রায়ান ভ্যানডেনবার্গ

59

সূচনা

আইএসওসি ++ 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

3
লভালুগুলির জন্য সমস্ত উদাহরণ এবং এক্সভালিউসের জন্য সমস্ত উদাহরণ গ্লুভ্যালের জন্য উদাহরণ। সম্পাদনার জন্য আপনাকে ধন্যবাদ!
ডানিয়েল স্যান্ডর

1
তুমি ঠিক. তিনটি প্রাথমিক মানের বিভাগ পর্যাপ্ত। মূল্যও হয় না প্রয়োজনীয়। আমি মনে করি সুবিধার জন্য মূল্য এবং গ্লুভ মান।
ডানিয়েল স্যান্ডর

1
ভেরিয়েবলটি বোঝার struct As{void f(){this;}}জন্য একটি কঠিন সময় ছিল thisএকটি মূল্য। আমি ভেবেছিলাম thisএকটি মূল্যবান হওয়া উচিত। 9.3.2 স্ট্যান্ডার্ড না বলা পর্যন্ত: অ স্থিতিশীল (9.3) সদস্য ফাংশনের শরীরে, মূল শব্দটি এটি একটি মূল্যবান অভিব্যক্তি।
r0ng

3
@ r0ng thisএকটি মূল্যবান তবে *thisএটি একটি মূল্যবান
Xeverous

1
"www" সবসময় একই ঠিকানা থাকে না । এটি একটি মূল্যবান কারণ এটি একটি অ্যারে
wally

35

সি ++ 03 এর বিভাগগুলি সঠিকভাবে অভিব্যক্তিগুলির বৈশিষ্ট্যগুলিতে যথাযথ রেফারেন্সের প্রবর্তন ক্যাপচার করতে সীমিত নয়।

তাদের প্রবর্তনের সাথে সাথে এটি বলা হয়েছিল যে একটি নামবিহীন মূলসূত্র রেফারেন্স কোনও মূল্যকে মূল্যায়ন করে যেমন ওভারলোড রেজোলিউশনটি মূল্যের রেফারেন্স বাইন্ডিংগুলিকে পছন্দ করে, যা এটি অনুলিপি নির্মাণকারীদের তুলনায় মুভ কনস্ট্রাক্টরগুলিকে নির্বাচন করে। তবে এটি সন্ধান করেছিল যে এটি চারদিকে সমস্যা সৃষ্টি করে, উদাহরণস্বরূপ ডায়নামিক টাইপ এবং যোগ্যতার সাথে।

এটি দেখানোর জন্য, বিবেচনা করুন

int const&& f();

int main() {
  int &&i = f(); // disgusting!
}

প্রাক-xvalue খসড়াগুলিতে এটি অনুমোদিত হয়েছিল, কারণ C ++ 03 এ, শ্রেণিবদ্ধ ধরণের মানগুলি কখনই সিভি-যোগ্য হয় না। তবে এটি উদ্দেশ্যযুক্ত যে constমূল্য-রেফারেন্স ক্ষেত্রে প্রযোজ্য, কারণ এখানে আমরা করি বস্তুগুলিকে (= মেমরি!) উল্লেখ , এবং অ-শ্রেণীর মূল্যবোধ থেকে কন্সটি বাদ দেওয়া মূলত এই কারণে যে এখানে কোনও বস্তু নেই।

গতিশীল প্রকারের জন্য সমস্যাটি একই রকমের। সি ++ তে, শ্রেণীর ধরণের মূল্যবোধগুলির একটি পরিচিত গতিশীল প্রকার রয়েছে - এটি সেই অভিব্যক্তির স্থিতিশীল প্রকার। এটি অন্য উপায়ে রাখার জন্য আপনার রেফারেন্স বা ডেরেফারেন্স দরকার, যা মূল্যকে মূল্যায়ন করে। নামবিহীন মূল্যবোধের রেফারেন্স সহ এটি সত্য নয়, তবুও তারা বহুবিধ আচরণ প্রদর্শন করতে পারে। সুতরাং এটি সমাধান করতে,

  • নামবিহীন মূল্যবোধের রেফারেন্সগুলি xvalue হয় । তারা যোগ্য হতে পারে এবং সম্ভাব্যভাবে তাদের গতিশীল ধরণের আলাদা থাকতে পারে। তারা যেমন ইচ্ছা মতোই ওভারলোডিংয়ের সময় মূলসূত্রের রেফারেন্স পছন্দ করে এবং নন-কনস্ট্যান্ট লভ্যালু রেফারেন্সের সাথে আবদ্ধ হয় না।

  • এর আগে যা ছিল একটি মূল্য (আক্ষরিক, নন-রেফারেন্স ধরণের ক্ষেত্রে ক্যাসেট দ্বারা তৈরি বস্তু) এখন একটি মূল্যবান হয়ে ওঠে । ওভারলোডিংয়ের সময় তাদের xvalues ​​হিসাবে একই পছন্দ রয়েছে।

  • যা আগে লিভালু ছিল সেগুলি লভ্য থাকে।

এবং যোগ্যতা অর্জন করতে পারে এবং বিভিন্ন গতিশীল ধরণের ( গ্লাভলিউস ) থাকতে পারে এবং যেখানে ওভারলোডিং মূল্যের রেফারেন্স বাইন্ডিং ( মানগুলি ) পছন্দ করে তাদের ক্যাপচার করার জন্য দুটি গ্রুপিং করা হয় ।


1
উত্তরটি অবশ্যই যুক্তিসঙ্গত। এক্সভ্যালু কেবলমাত্র মূল্যায়ন যা সিভি-যোগ্য এবং গতিশীল টাইপ করা যায়!
ligand

26

আমি মান বিভাগের cppreferences.com ব্যাখ্যাটি না আসা পর্যন্ত আমি দীর্ঘদিন ধরে এটির সাথে লড়াই করেছি ।

এটি আসলে বরং সহজ, তবে আমি দেখতে পাচ্ছি যে এটি প্রায়শই এমনভাবে ব্যাখ্যা করা হয় যা মুখস্থ করা শক্ত। এখানে এটি খুব পরিকল্পনার সাথে ব্যাখ্যা করা হয়েছে। আমি পৃষ্ঠার কিছু অংশ উদ্ধৃত করব:

প্রাথমিক বিভাগসমূহ

প্রাথমিক মান বিভাগগুলি দুটি অভিব্যক্তির সাথে সম্পর্কিত:

  • পরিচয় রয়েছে : অভিব্যক্তিটি অন্য অভিব্যক্তির মতো একই সত্তাকে বোঝায় কিনা তা নির্ধারণ করা সম্ভব যেমন বস্তুর ঠিকানা বা তাদের চিহ্নিত ফাংশনগুলির সাথে তুলনা করে (প্রত্যক্ষ বা অপ্রত্যক্ষভাবে প্রাপ্ত);

  • এখান থেকে সরানো যেতে পারে : মুভ কনস্ট্রাক্টর, মুভ অ্যাসাইনমেন্ট অপারেটর, বা অন্য কোনও ফাংশন ওভারলোড যা মুভি সেমেন্টিকস প্রয়োগ করে এক্সপ্রেশনটিকে বাঁধতে পারে।

যে অভিব্যক্তি:

  • পরিচয় আছে এবং এখান থেকে সরানো যায় না তাকে বলা হয় ল্যাভেলু এক্সপ্রেশন ;
  • পরিচয় আছে এবং এখান থেকে সরানো যেতে পারে বলা হয় xvalue এক্সপ্রেশন ;
  • পরিচয় নেই এবং এখান থেকে সরানো যেতে পারে যাকে বলা হয় মূল্য প্রকাশ ;
  • পরিচয় নেই এবং এখান থেকে সরানো যায় না ব্যবহার করা হয় না।

lvalue

ল্যাভেলু ("বাম মান") এক্সপ্রেশনটি এমন একটি অভিব্যক্তি যা পরিচয় রাখে এবং এখান থেকে সরানো যায় না

মূল্য (সি ++ 11 অবধি), মূল্য (সি ++ 11 থেকে)

একটি মূল্য ("খাঁটি মূল্য") এক্সপ্রেশনটি এমন একটি অভিব্যক্তি যা পরিচয় নেই এবং এখান থেকে সরানো যেতে পারে

xvalue

একটি xvalue ("মেয়াদ উত্তীর্ণ হওয়া মান") এক্সপ্রেশনটি এমন একটি অভিব্যক্তি যা পরিচয় রয়েছে এবং সেখান থেকে সরানো যেতে পারে

glvalue

একটি গ্লাভ ("জেনারালাইজড লভালু") এক্সপ্রেশন এমন একটি অভিব্যক্তি যা হয় একটি ল্যাভালু বা একটি জালু। এটা তোলে পরিচয় আছে । এটি থেকে সরানো বা নাও হতে পারে।

মূল্যায়ন (যেহেতু সি ++ 11)

একটি মূল্য ("ডান মান") এক্সপ্রেশনটি এমন একটি অভিব্যক্তি যা হয় একটি মূল্য বা একটি মূল্য। এটি থেকে সরানো যেতে পারে । এটির পরিচয় থাকতে পারে বা নাও থাকতে পারে।


1
কিছু বইয়ে, এক্সওয়ালুগুলি তাদের এক্সটি "বিশেষজ্ঞ" বা "ব্যতিক্রমী" থেকে এসেছে বলে দেখানো হয়েছে
নভেম্বর

এবং আরও গুরুত্বপূর্ণ, তাদের সর্ব-বিস্তৃত উদাহরণ তালিকা।
সিরো সান্তিলি 冠状 病毒 审查 六四 事件

19

এই নতুন বিভাগগুলি কীভাবে বিদ্যমান মূল্যায়ন এবং মূল্যবান বিভাগগুলির সাথে সম্পর্কিত?

একটি সি ++ 03 লভ্যালু এখনও একটি সি ++ 11 ল্যাভ্যালু, যেখানে একটি সি ++ 03 মূল্যকে সি ++ 11-এ মূল্য বলা হয়।


14

উপরের উত্তরের উত্তরের একটি সংযোজন, এমন একটি বিন্দুতে যা আমি স্ট্রোস্ট্রাপ পড়ার পরেও আমাকে বিভ্রান্ত করেছিলাম এবং ভেবেছিলাম যে আমি মূল্য / মূল্যমানের পার্থক্য বুঝতে পেরেছি। কখন দেখছ

int&& a = 3,

এটি int&&টাইপ হিসাবে পড়তে খুব লোভনীয় এবং সিদ্ধান্তটি যে aএটি একটি মূল্য val এটি না:

int&& a = 3;
int&& c = a; //error: cannot bind 'int' lvalue to 'int&&'
int& b = a; //compiles

aএকটি নাম আছে এবং ইপসো হল একটি মূল্যবান। &&এর ধরণের অংশ হিসাবে ভাবেন না a; এটি আপনাকে বলার মতো কিছুa যা আপনাকে বেঁধে দেওয়ার অনুমতি দেওয়া হয়

এটি T&&কনস্ট্রাক্টরগুলিতে টাইপ আর্গুমেন্টের জন্য বিশেষত গুরুত্বপূর্ণ । যদি লিখি

Foo::Foo(T&& _t) : t{_t} {}

আপনি অনুলিপি হবে _tমধ্যে t। তোমার দরকার

Foo::Foo(T&& _t) : t{std::move(_t)} {}যদি আপনি সরানো চান আমি যখন বাইরে চলে আসি তখন কি আমার সংকলক আমাকে সতর্ক করে দিত move!


1
আমি মনে করি এই উত্তরটি পরিষ্কার করা যেতে পারে। "কিসের aসাথে বাঁধাই করার অনুমতি দেওয়া হয়েছে": অবশ্যই, তবে 2 এবং 3 লাইনে আপনার ভেরিয়েবলগুলি সি & বি হয়, এবং এটি এমন কোনও নয় যা বেঁধে দেয় এবং এখানে প্রকারটি aঅপ্রাসঙ্গিক, তাই না? লাইনগুলি aঘোষিত হলে একই হবে int a। এখানে আসল মূল পার্থক্যটি হ'ল লাইন 1 এ একটি const3 এর সাথে আবদ্ধ হতে হবে না
ফেলিক্স ডমব্যাক

12

পূর্ববর্তী উত্তরগুলি যেমন মূল্য বিভাগের পিছনে তত্ত্বটি পরিচ্ছন্নভাবে আবৃত করে, আমি আরও একটি জিনিস যুক্ত করতে চাই: আপনি আসলে এটির সাথে খেলতে পারেন এবং এটি পরীক্ষা করতে পারেন।

মান বিভাগগুলির সাথে কিছু পরীক্ষার জন্য, আপনি ডিক্লাইপ স্পেসিফায়ার ব্যবহার করতে পারেন । এর আচরণটি তিনটি প্রাথমিক মানের বিভাগ (xvalue, lvalue এবং prueue) এর মধ্যে স্পষ্টভাবে পার্থক্য করে।

প্রিপ্রোসেসর ব্যবহার করে আমাদের কিছু টাইপ করা সাশ্রয় হয় ...

প্রাথমিক বিভাগ:

#define IS_XVALUE(X) std::is_rvalue_reference<decltype((X))>::value
#define IS_LVALUE(X) std::is_lvalue_reference<decltype((X))>::value
#define IS_PRVALUE(X) !std::is_reference<decltype((X))>::value

মিশ্র বিভাগ:

#define IS_GLVALUE(X) (IS_LVALUE(X) || IS_XVALUE(X))
#define IS_RVALUE(X) (IS_PRVALUE(X) || IS_XVALUE(X))

এখন আমরা মান বিভাগে সিপ্রেফারেন্স থেকে সমস্ত উদাহরণ (প্রায়) পুনরুত্পাদন করতে পারি ।

সি ++ 17 (টর্স স্ট্যাটিক_সেসার্টের জন্য) এর সাথে এখানে কয়েকটি উদাহরণ দেওয়া হয়েছে:

void doesNothing(){}
struct S
{
    int x{0};
};
int x = 1;
int y = 2;
S s;

static_assert(IS_LVALUE(x));
static_assert(IS_LVALUE(x+=y));
static_assert(IS_LVALUE("Hello world!"));
static_assert(IS_LVALUE(++x));

static_assert(IS_PRVALUE(1));
static_assert(IS_PRVALUE(x++));
static_assert(IS_PRVALUE(static_cast<double>(x)));
static_assert(IS_PRVALUE(std::string{}));
static_assert(IS_PRVALUE(throw std::exception()));
static_assert(IS_PRVALUE(doesNothing()));

static_assert(IS_XVALUE(std::move(s)));
// The next one doesn't work in gcc 8.2 but in gcc 9.1. Clang 7.0.0 and msvc 19.16 are doing fine.
static_assert(IS_XVALUE(S().x)); 

মিশ্র বিভাগগুলি একসময় বিরক্তিকর হয় যখন আপনি প্রাথমিক বিভাগটি আবিষ্কার করেন।

আরও কয়েকটি উদাহরণের জন্য (এবং পরীক্ষা-নিরীক্ষার জন্য), সংকলক এক্সপ্লোরারের নীচের লিঙ্কটি দেখুন । যদিও সমাবেশটি পড়তে বিরক্ত করবেন না। আমি নিশ্চিত হয়েছি যে এটি সমস্ত সাধারণ সংকলক জুড়ে কাজ করে a


আমি মনে করি অন্যথায় যদি আপনি দুজন হয় তবে অন্যথায় কী #define IS_GLVALUE(X) IS_LVALUE(X) || IS_XVALUE(X)হওয়া উচিত । #define IS_GLVALUE(X) (IS_LVALUE(X) || IS_XVALUE(X))&&IS_GLVALUE
গ্যাব্রিয়েল ডেভিলার্স
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.