সি ++ 11 এ নিরাপদ-বুল আইডিয়োম অচল?


179

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

explicit operator bool() const;

উত্তরের মান অনুসারে §4 [conv] p3:

কোনও এক্সপ্রেশন ই স্পষ্টভাবে কোনও প্রকারে রূপান্তরিত হতে পারে Tযদি এবং কেবলমাত্র ঘোষণাটি T t=e;ভালভাবে তৈরি হয় তবে কিছু উদ্ভাবিত অস্থায়ী পরিবর্তনশীল t(§8.5)। কিছু ভাষা নির্মাণের প্রয়োজন বোধ হয় যে একটি অভিব্যক্তি বুলিয়ান মানতে রূপান্তরিত হয়। এই eজাতীয় প্রসঙ্গে উপস্থিত একটি অভিব্যক্তিটি প্রাসঙ্গিকভাবে রূপান্তরিত হয় boolএবং বলা হয় কেবলমাত্র যদি ঘোষণাটি bool t(e);ভালভাবে তৈরি হয় তবে কিছু উদ্ভাবিত অস্থায়ী পরিবর্তনশীল টি (.58.5) এর জন্য।

হাইলাইট করা অংশটি পরিষ্কারভাবে "আরহি স্পষ্ট কাস্ট" (মান হিসাবে "প্রাসঙ্গিক রূপান্তর" বলা হয়) @ আর হিসাবে দেখায়। মার্টিনহো রেখে দিলেন।

"নির্দিষ্ট ভাষা রচনাগুলি" যা "অন্তর্নিহিত সুস্পষ্ট কাস্ট" এর জন্য নিম্নলিখিত বলে মনে হয়:

  • if, while, for( §6.4 [stmt.select] p4)
  • বাইনারি লজিকাল অপারেটর &&এবং ||( §5.14 [expr.log.and/or] p1উভয়ের জন্য)
  • লজিকাল নেগ্রেশন অপারেটর !( §5.3.1 [expr.unary.op] p9)
  • শর্তসাপেক্ষ অপারেটর ?:( §5.14 [expr.cond] p1)
  • static_assert( §7 [dcl.dcl] p4)
  • noexcept( §15.4 [except.spec] p2)

শিরোনামে আমাদের ধারণা সঠিক? আমি আশা করি আমরা কোনও সম্ভাব্য ত্রুটিগুলি উপেক্ষা করিনি।


30
+1: আমি এই জাতীয় প্রশ্নটি পছন্দ করি যা আমাকে আসন্ন মান সম্পর্কে নতুন জিনিস শিখায়।
বিজন পোলাক্স

1
আপনি কী জানেন স্পষ্টত স্পষ্ট নিক্ষিপ্তটি কী স্ট্যান্ডার্ডে হারিয়ে যাচ্ছে ... অন্যের কাছ থেকে কিছু ফিরিয়ে দিচ্ছেন operator bool। উদাহরণস্বরূপ, যদি আমার কাছে shared_ptrp নামক কোনও সদস্য থাকে এবং এই পদ্ধতিটি operator bool() const { return p; }থাকে:, এটি সংকলন করতে ব্যর্থ। এটা বোকা আইএমও।
ডেভিড

"ডেভিড" "অন্তর্নিহিত সুস্পষ্ট" কাস্ট দ্বারা আপনার অর্থ কী?
জেড

উত্তর:


128

হ্যাঁ. এই শুধুমাত্র অন্তর্নিহিত ব্যবহারকারী-সংজ্ঞায়িত ধর্মান্তর এবং স্পষ্ট ব্যবহারকারী-সংজ্ঞায়িত রূপান্তর অপারেটার কার্যত ছিল না থাকার সঙ্গে সমস্যা উদাহরণস্বরূপ এই সমস্যার কারণে উদ্ভাবিত এবং কিছু অনেক পরিষ্কার এবং আরও বেশি যৌক্তিক সঙ্গে সব নিরাপদ-bool, কাপড় প্রতিস্থাপন।


-5

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


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

4
দুঃখিত, এটি জানতে সক্ষম হত না। আমি শুরুতে কেবল যুক্ত উত্তরটিকে বিবেচনা করি নি, তবে প্রশ্নটি [সি ++] এবং [সি ++ - ফ্যাক্স] ট্যাগ করার বিষয়টিও আমাকে ভাবতে পরিচালিত করেছিল যে ভাষার উভয় স্তরের মূল্যায়ন প্রাসঙ্গিক ছিল।
লুইস মাচুকা

1
আপনি অবশ্যই ঠিক বলেছেন, আমি এটিকে প্রশ্নে স্পষ্ট করে বলিনি। আমি এটি সম্পাদনা করব, মাথা আপ জন্য ধন্যবাদ।
Xoo

1
এই উত্তরটি সত্যই আপডেটিং ব্যবহার করতে পারে, এখন এটি প্রায় দুই বছরের পুরানো।
কুকুরছানা

1
মতবিরোধের কারণে আমাকে হ্রাস করতে হবে, যদিও আমি আপনাকে ব্যক্তিগতভাবে একটি বিয়ার কিনেছিলাম এবং "আরে কোনও শক্ত অনুভূতি" না বলি। --std=c++0xচূড়ান্ত পেরেকটি মানক কফিনে চালিত হওয়ার অনেক আগে থেকেই সি ++ 11-তে অনেকগুলি দৃষ্টান্ত স্থাপনের অভিজ্ঞতা নিয়েছিল এবং তারা নামটি আইএসও স্পেসে রাখার সিদ্ধান্ত নিয়েছে। আপনি যদি সত্যিই গভীর টেমপ্লেট রূপক ক্রিয়াকলাপ না করে থাকেন তবে লোকেরা কী ব্যবহার করছে তা C ++ 11 টি বিশদের বিবরণ আপনার কোনও ফলস্বরূপ হওয়ার সম্ভাবনা নেই ... যার অর্থ এটি তখন পর্যন্ত প্রায় সমস্ত ব্যবহারিক উদ্দেশ্যে 2011 এর চেয়ে পুরানো ছিল was এবং এখন, আমার ঘড়ির মধ্যে, এটি প্রায় 2015.
হোস্টাইলফোর্ক বলেছেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.