"ওডিআর-ব্যবহার" এর অর্থ কী?


92

এটি সবেমাত্র অন্য প্রশ্নের প্রসঙ্গে উঠে এসেছিল ।

ক্লাস টেম্পলেটগুলিতে দৃশ্যত সদস্য ফাংশনগুলি কেবলমাত্র ওডিআর-ব্যবহৃত হলে তা তাত্ক্ষণিক হয়। কেউ ঠিক কি এর অর্থ বলতে পারে। ওয়ান ডেফিনিশন রুল (ওডিআর) এর উইকিপিডিয়া নিবন্ধে " ওডিআর-ব্যবহার " উল্লেখ করা হয়নি ।

তবে মান এটি হিসাবে সংজ্ঞায়িত করে

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

[বেসিক.ডেফ.অর্ডার] এ।

সম্পাদনা: দৃশ্যত এটি ভুল অংশ এবং পুরো অনুচ্ছেদে বিভিন্ন জিনিসের একাধিক সংজ্ঞা রয়েছে। এটি ক্লাস টেম্পলেট সদস্য ফাংশনের জন্য প্রাসঙ্গিক হতে পারে:

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

তবে আমি বুঝতে পারি না, এই নিয়মটি একাধিক সংকলন ইউনিট জুড়ে কীভাবে কাজ করে? যদি আমি স্পষ্টভাবে কোনও শ্রেণীর টেম্পলেট ইনস্ট্যান্ট করি তবে সমস্ত সদস্য ফাংশন কি তাত্ক্ষণিক হয়?


4
নোট করুন [মৌলিক.দেফ.অর্ডার] / class ক্লাস টেম্পলেটগুলির সদস্য ফাংশনের ক্ষেত্রে প্রযোজ্য "এখানে একাধিক সংজ্ঞা থাকতে পারে [...]"
ডায়প

4
"আমি যদি স্পষ্টভাবে কোনও শ্রেণীর টেম্পলেট ইনস্ট্যান্ট করি তবে সমস্ত সদস্যের কাজগুলি কি তাত্ক্ষণিক হয়?" হ্যাঁ, [অস্থায়ীভাবে বর্ণিত] / 8 + 9
ডায়প করুন

উত্তর:


71

এটি কেবল একটি স্বেচ্ছাসেবী সংজ্ঞা, যখন আপনাকে কোনও সত্তার জন্য কোনও সংজ্ঞা প্রদান করতে হবে তা নির্দিষ্ট করার জন্য স্ট্যান্ডার্ড দ্বারা ব্যবহৃত হয় (কেবলমাত্র কোনও ঘোষণার বিপরীতে)। স্ট্যান্ডার্ডটি কেবল "ব্যবহৃত" বলে না, কারণ এটি প্রসঙ্গের উপর নির্ভর করে বিবিধ ব্যাখ্যা করা যেতে পারে। এবং কিছু ওডিআর-ব্যবহার সত্যিই কোনওটির সাথে "ব্যবহার" এর সাথে মিলিত হওয়ার সাথে সামঞ্জস্য হয় না; উদাহরণস্বরূপ, ভার্চুয়াল ফাংশনটি সর্বদা ওডিআর-ব্যবহৃত হয় যতক্ষণ না এটি শুদ্ধ থাকে, এমনকি যদি প্রোগ্রামে কোথাও এটি ডাকা হয় না।

সম্পূর্ণ সংজ্ঞাটি para3.2 , দ্বিতীয় অনুচ্ছেদে রয়েছে যদিও এটি সংজ্ঞাটি সম্পূর্ণ করার জন্য অন্যান্য বিভাগের রেফারেন্স রয়েছে।

টেমপ্লেটগুলির সাথে সম্পর্কিত, ওডিআর-ব্যবহৃত কেবল প্রশ্নের অংশ; অন্য অংশটি তাত্ক্ষণিকতা। বিশেষত, যখন কোনও টেম্পলেট ইনস্ট্যান্ট করা হয় তখন §14.7 কভার করে। তবে দুটি সম্পর্কিত :14.7.1 (অন্তর্নিহিত তাত্ক্ষণিক) পাঠ্যটি বেশ দীর্ঘ হলেও মূল নীতিটি হ'ল কোনও টেম্পলেটটি কেবলমাত্র ব্যবহৃত হলে তা ইনস্ট্যান্টেশন করা হবে এবং এই প্রসঙ্গে, ব্যবহৃত অর্থ ওডিআর-ব্যবহৃত হয়। সুতরাং, শ্রেণি টেমপ্লেটের সদস্য ফাংশনটি কেবল তখনই বলা হয় বা এটি ভার্চুয়াল হয় এবং শ্রেণি নিজেই ইনস্ট্যান্ট হয়। স্ট্যান্ডার্ড নিজেই এটি অনেক স্থানে গণনা করে: স্বতন্ত্র উপাদানগুলির উপর std::list<>::sortব্যবহার <করে তবে আপনি কোনও উপাদান টাইপের উপরে একটি তালিকা ইনস্ট্যান্ট করতে পারেন যা সমর্থন করে না <, যতক্ষণ আপনি sortএটির কল করবেন না ।


ওডিআর-ব্যবহার "বস্তুগত টেম্পোরারি" দিয়ে ওভারল্যাপ করতে পারে?
v.oddou

23

সরল কথায় অদ্বিতীয় ব্যবহারের অর্থ এমন কিছু (ভেরিয়েবল বা ফাংশন) এমন একটি প্রসঙ্গে ব্যবহৃত হয় যেখানে এর সংজ্ঞা অবশ্যই উপস্থিত থাকতে হবে।

যেমন,

struct F {
   static const int g_x = 2;
};

int g_x_plus_1 = F::g_x + 1; // in this context, only the value of g_x is needed.
                             // so it's OK without the definition of g_x

vector<int>  vi;
vi.push_back( F::g_x );      // Error, this is odr-used, push_back(const int & t) expect
                             // a const lvalue, so it's definition must be present

দ্রষ্টব্য, উপরের পুশ_ব্যাক এমএসভিসি ২০১৩ সালে পাস হয়েছে, এই আচরণটি মান সম্মতি নয়, উভয়টি জিসিসি ৪.৮.২ এবং ঝনঝন 3..৮.০ ব্যর্থ হয়েছে, ত্রুটির বার্তাটি: `কে :: g_x 'এর অপরিবর্তিত রেফারেন্স


vi.push_back( F::g_x );সি ++ এর মতো স্থিতিশীল ডেটা সদস্যকে কী অদ্ভুতভাবে ব্যবহার করা সম্ভব ?
রঙ্কবাবা

তবে কোনও মূল্যায়নও পাস করা যেতে পারে const int&? স্থির কনস্টের সদস্যকে কি মূল্য হিসাবে চিহ্নিত করা যায়?
স্কটক্সিয়াও

8
সংক্ষিপ্ত খোলার বাক্যটির জন্য +1: "সরল কথায়, অদ্ভুত-ব্যবহৃত অর্থ এমন কিছু (পরিবর্তনশীল বা ফাংশন) এমন একটি প্রসঙ্গে ব্যবহৃত হয় যেখানে এর সংজ্ঞা অবশ্যই উপস্থিত থাকতে হবে।"
পল মাস্রি-স্টোন

4
আপনি কীভাবে এই কোডটি সংকলন করেছেন তা আমি বুঝতে পারি না। তারা কি একই টিইউতে আছে?। যদি সেগুলি হয় তবে F :: g_x এর আগেই সংজ্ঞায়িত করা হয়েছে push_back, অবশ্যই এটি পাস হবে। তাই না?
লুইস চ্যান

4
@ বিগক্সিয়াও " একটি মূল্যায়নও পাস হতে পারে " হ্যাঁ এবং একটি অস্থায়ী অবজেক্টটি কম্পাইলার এবং সেই বস্তুর সাথে আবদ্ধ রেফারেন্স দ্বারা তৈরি করা হয়েছে। ওয়ালটহ যখন একটি ল্যাভেলু পাস করে তার অর্থ লভালিউয়ের মূল্যায়ন দ্বারা চিহ্নিত সেই বস্তুটি পাস করা: আপনি যখন একটি লভালু পাস করেন আপনি ফাংশনটিতে প্যারামিটারটি সঠিক অবজেক্টটি উল্লেখ করার জন্য আশা করতে পারেন। সংকলক একটি অস্থায়ী তৈরি করবে না। যদি আপনি একটি অস্থায়ী চান, সাথে একটি তৈরি করুন operator+
কৌতূহলী
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.