সি ++: কনস্ট্যান্ট রেফারেন্স, টাইপ-স্পেসিফায়ারের পরে বনামের আগে


144

যুক্তিগুলির মধ্যে পার্থক্য কী:

int foo1(const Fred &arg) {
...
}

এবং

int foo2(Fred const &arg) {
...
}

? আমি এই মামলাটি প্যারাসিফ্ট এফএকিউতে আচ্ছাদিত দেখছি না।



2
এটি স্টাইল সম্পর্কে একটি প্রশ্ন? "কনস্ট ফ্রেড" ইংরাজীতে ভাল লাগছে, তবে "ফ্রেড কনস্ট" আমার কাছে আরও ভাল দেখাচ্ছে।
লাটিনসুড

1
সম্পর্কিত নোটে, কারও Fred const &argবেশি কারণ পছন্দ করা উচিত Fred const& arg? আমি const&উত্তরোত্তরটি আরও ভাল পছন্দ করি কারণ সেখানে একটি ইউনিট যার অর্থ "কনস্ট্রেফ", এবং নামটি argসমস্ত ধরণের স্পেসিফায়ার থেকে ফাঁকা করে আলাদা করা হয়।
ফ্রাঙ্ক

4
@ ডিহমান: তবে এর int const& refঅর্থ ' কনস্ট রেফ' নয় বরং 'রেফ টু কনস্ট'।
সিড্রিক এইচ।

উত্তর:


112

কনস্টের হিসাবে কোনও পার্থক্য ডান থেকে বামে & পড়ার ক্ষেত্রে পড়া হয়, সুতরাং উভয়ই একটি পরিবর্তনীয় ফ্রেড উদাহরণের জন্য একটি রেফারেন্স উপস্থাপন করে।

Fred& constএর অর্থ হ'ল রেফারেন্স নিজেই অপরিবর্তনীয়, যা অপ্রয়োজনীয় ; উভয় কনস্ট পয়েন্টারগুলির সাথে কাজ করার সময় Fred const*এবং Fred* constবৈধ তবে ভিন্ন।

এটি স্টাইলের বিষয়, তবে আমি constপ্রত্যয় হিসাবে ব্যবহার করতে পছন্দ করি কারণ এটি কনস্ট সদস্য সদস্যের ক্রিয়া সহ ধারাবাহিকভাবে প্রয়োগ করা যেতে পারে ।


তারপরে কী std::is_const<const T&>::valueহতে হবে false?
অতল 7.7

@ abyss.7 এটি একটি রেফারেন্স const T; রেফারেন্স পরিবর্তনযোগ্য।
সান ফৌজেট

125

আচরণ

সেখানে মধ্যে কোনো শব্দার্থিক পার্থক্য নেই const T&এবং T const&; ভাষা তাদের একই ধরণের হিসাবে বিবেচনা করে। (একই জিনিসটি const T*এবং প্রযোজ্য T const*)

স্টাইলের বিষয় হিসাবে

আপনার স্টাইলিস্টিকভাবে যা পছন্দ করা উচিত সে সম্পর্কে, তবে, আমি অন্যান্য উত্তরগুলি থেকে অনেকটা অসম্মতি জানব এবং পছন্দ করব const T&(এবং const T*):

  • const T&স্ট্রোস্ট্রপের সি সি ++ প্রোগ্রামিং ল্যাঙ্গুয়েজ বইতে ব্যবহৃত স্টাইলটি ।
  • const T& সি ++ স্ট্যান্ডার্ড নিজেই ব্যবহৃত শৈলী।
  • const T*কে অ্যান্ড আর এর সি প্রোগ্রামিং ল্যাঙ্গুয়েজে ব্যবহৃত স্টাইল বইতে ।
  • const T* সি স্ট্যান্ডার্ড ব্যবহৃত শৈলী হয়।
  • উপরের কারণগুলির কারণে, আমি মনে করি const T&/ এর const T*চেয়ে বেশি জড়তা T const&/ আছে T const*const T&/ const T*অভিজ্ঞতাকে আমার কাছে দেখা সমস্ত সি ++ এবং সি কোডের চেয়ে T const&/ আমার কাছে সাধারণভাবে মনে হয় T const*। আমি মনে করি ডান থেকে বামে পার্সিংয়ের নিয়ম মেনে চলা কপিরাইটের চেয়ে সাধারণ প্রচলিত পদ্ধতিগুলি আরও পঠনযোগ্য।
  • এর সাথে T const*, এটির *মতো স্থানটি সহজেই সহজে পাওয়া যায় T* const(বিশেষত যদি লোকেরা এর সাথে অভ্যস্ত না হয়)। বিপরীতে, const* Tআইনী বাক্য গঠন নয়।

ডান থেকে বামে পার্সিং বিধি সম্পর্কে কী?

পুরো ডান থেকে বাম পার্সিং যুক্তি সম্পর্কিত যেগুলি লোকেরা ব্যবহার করতে পছন্দ করে বলে মনে হচ্ছে: যেমন আমি অন্য উত্তরের মন্তব্যে উল্লেখ করেছি, const T&ডান থেকে বামেও সূক্ষ্মভাবে পড়েছি । এটি একটি টি ধ্রুবক একটি রেফারেন্স। "টি" এবং "ধ্রুবক" প্রত্যেকে বিশেষণ বা বিশেষ্য হিসাবে কাজ করতে পারে। (উপরন্তু, পড়া T const*ডান-থেকে-বাম দ্ব্যর্থক হতে পারে যেহেতু এটি ভুল হিসাবে "পয়েন্টার ধ্রুবক ব্যাখ্যা করা যেতে পারে করার পরিবর্তে হিসাবে" পয়েন্টার টি " করতে ধ্রুবক টি"।)


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

2
-1। আপনার সিদ্ধান্তগুলি কতটুকু ন্যায়সঙ্গত এবং আমি ব্যক্তিগতভাবে তাদের সাথে কতটা সম্মত তা বিবেচনা না করেই তারা সরাসরি জিজ্ঞাসিত প্রশ্নের উত্তর দিচ্ছে না । এটি কোনও সরল প্রশ্নের দ্বিতীয় সর্বাধিক উত্তরটি কোনও অগোছালো আন্ডার ওয়াটার মেশিনারি সম্পর্কে কোনও অফ-টোপিক জিব্বারিশের মতো উপস্থিত হয় যার কোনও সিদ্ধান্ত নেই, সরাসরি উত্তর নেই - কিছুই নয়। " না, উভয় বাক্য বিন্যাসের মধ্যে কোনও অর্থগত পার্থক্য নেই , তবে এখানে কিছু স্টাইলিস্টিকাল বিবেচনা রয়েছে ..." উল্লেখ করে আপনি আমার উত্সাহ পাবেন get এবং কেবল তখন all সমস্ত গুলি।
ulidtko

1
আইএমও কারণটি const T&আরও ভালভাবে পড়ে is- 1- আমরা বাম থেকে ডানে কোড পড়ি to এবং 2- একটি নতুন ধারণা বর্ণনা করার সময় আমরা আরও সাধারণ ধারণা থেকে আরও নির্দিষ্ট থেকে শুরু করি। এখানে, constকীওয়ার্ডটি আরও সাধারণ কারণ এটি চলক স্থানটিকে দুটি বিভাগে বিভক্ত করে, অন্যদিকে টাইপ স্পেসিফায়ার এটিকে অনেকগুলি বিভাগ করে।
pooya13

"পয়েন্টার টু" একসাথে থাকা উচিত। সুতরাংT const*
ডেক্সটারের

13

যদিও তারা এক এবং একই, ডানদিকে-বামের সাথে ধারাবাহিকতা বজায় রাখতে সি এবং সি ++ ঘোষণাগুলি পার্স করার বিষয়ে নিয়মের , এটি লেখার চেয়ে ভালFred const &arg

এছাড়াও উল্লেখ করুন এই ঘোষণা, কোয়ালিফায়ার এবং declarators সম্পর্কে আরো বুঝতে উন্নয়নশীল জন্য।


1
আমি প্রত্যয়টি পছন্দ করি কারণ এটি typedefপ্রসারণের সাথে আরও ভাল কাজ করে । উদাহরণ: typedef int* pointer;, const pointer নয় const int* , এটা int* const। প্রত্যয় ফর্মটি বিশ্রী নয়।
ম্যাথিউ এম।

4
আইএমও const T&ডান থেকে বামেও সূক্ষ্ম পাঠ করে; এটি একটি টি ধ্রুবক একটি রেফারেন্স। Tএবং constantপ্রত্যেকে বিশেষণ বা বিশেষ্য হিসাবে কাজ করতে পারে
জেমসডলিন

7

উভয়ই কাজ করে এবং এখানে যে লোকটি লিখেছিল তার ব্যাখ্যা এখানে
তাকে উদ্ধৃত করার জন্য:

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




3

রেফারেন্সগুলি পয়েন্টারগুলির মতো একইভাবে কাজ করে না: পয়েন্টারগুলির জন্য আপনার কাছে 'কনস্ট পয়েন্টার' ( type * const p) এবং 'পয়েন্টার টু কনস্ট' থাকতে পারে ( const type * pবাtype const * p ) থাকতে পারে।

তবে আপনার কাছে রেফারেন্সের জন্য এটি নেই: একটি রেফারেন্স সর্বদা একই অবজেক্টকে উল্লেখ করবে; সেই অর্থে আপনি বিবেচনা করতে পারেন যে 'রেফারেন্সগুলি' 'কনস্ট রেফারেন্স' (একইভাবে আপনার 'কনস্ট পয়েন্টার' থাকতে পারে)।

সুতরাং 'টাইপ অ্যান্ড কনস্ট রেফ' এর মতো কিছু আইনী নয়। আপনার কাছে কেবল 'টাইপের রেফারেন্স' ( type &ref) এবং 'ধ্রুবক টাইপের রেফারেন্স' থাকতে পারে ( const type &refবাtype const &ref ; উভয়ই ঠিক সমান)।

একটি শেষ কথা: এমনকি const typeইংরেজিতে আরও সঠিক শোনার পরেও , লেখা type const"ডান থেকে বাম" ঘোষণার আরও নিয়মতান্ত্রিক বোঝার অনুমতি দেয়: int const & refপড়তে পারে 'রেফ একটি ধ্রুবক অন্তর্নিহিত একটি রেফারেন্স'। বা আরও জটিল উদাহরণ int const * const & ref:, রেফ হ'ল ধ্রুবক সংকেতের একটি ধ্রুবক পয়েন্টারের একটি উল্লেখ।

উপসংহার: আপনার প্রশ্নে উভয়ই ঠিক সমান।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.