সি ++ অটো এবং বনাম অটো


91

স্থানীয় ভেরিয়েবলগুলি তৈরি করার সময়, এটি ব্যবহার করা সঠিক (const) auto&বা না auto?

যেমন:

SomeClass object;
const auto result = object.SomeMethod();

বা const auto& result = object.SomeMethod();

যেখানে সামমথোড () একটি অ-আদিম মান প্রদান করে - অন্য কোনও ব্যবহারকারী-সংজ্ঞায়িত প্রকার। আমার বোঝাপড়াটি const auto& resultসঠিক যেহেতু সোমমেথোদ () দ্বারা প্রাপ্ত ফলাফল প্রত্যাবর্তিত ধরণের জন্য অনুলিপি নির্মাণকারীকে কল করবে। আমি ভুল হলে আমাকে সংশোধন করুন।

আদিম ধরণের সম্পর্কে কী? আমার ধারণা const auto sum = 1 + 2;ঠিক আছে।

এটি কি লুপের উপর ভিত্তি করে রেঞ্জের ক্ষেত্রেও প্রযোজ্য?

for(const auto& object : objects)

4
আমি আপনাকে এটি পড়ার জন্য অত্যন্ত পরামর্শ দিচ্ছি: safaribooksonline.com/library/view/effective-modern-c/… প্রথম দুটি অধ্যায়গুলি নিখরচায় রয়েছে এবং টেমপ্লেটের ধরণের ছাড়ের বর্ণনা দেয় যা মূলত কীভাবে autoকাজ করে ( initializer_listএস এর অদ্ভুত ক্ষেত্রে বাদে যা কোনও টেম্পলেট প্রসঙ্গে অ-অনুদান ছাড়াই), তারপরে autoছাড়ের টাইপ করুন।
ভিসফটকো

উত্তর:


107

autoএবং auto &&বেশিরভাগ ক্ষেত্রে কভার করুন:

  • আপনার autoযখন কোনও স্থানীয় অনুলিপি প্রয়োজন তখন ব্যবহার করুন । এটি কখনই রেফারেন্স তৈরি করে না। অনুলিপি (বা সরানো) নির্মাণকারীর অবশ্যই উপস্থিত থাকতে হবে, তবে অনুলিপি অপ্টিমাইজেশনের কারণে এটি কল নাও হতে পারে ।

  • auto &&যখন অবজেক্টটি স্থানীয় কিনা সে বিষয়ে আপনি চিন্তা করবেন না তখন ব্যবহার করুন । প্রযুক্তিগতভাবে, এটি সর্বদা একটি রেফারেন্স তৈরি করে, তবে যদি প্রাথমিককরণটি একটি অস্থায়ী হয় (উদাহরণস্বরূপ, ফাংশনটি মান অনুসারে ফিরে আসে), এটি মূলত আপনার নিজের স্থানীয় অবজেক্টের মতো আচরণ করবে।

    এছাড়াও, auto &&গ্যারান্টি দেয় না যে বস্তুটি হয় পরিবর্তনযোগ্য হবে। কোনও constবস্তু বা রেফারেন্স দেওয়া হয়েছে, এটি হ্রাস করবে const। তবে সুনির্দিষ্ট প্রসঙ্গে প্রদত্ত পরিবর্তনগুলি প্রায়শই ধরে নেওয়া হয়।

auto &এবং auto const &কিছুটা সুনির্দিষ্ট:

  • auto &গ্যারান্টি দেয় যে আপনি ভেরিয়েবলটি অন্য কোনও কিছুর সাথে ভাগ করছেন। এটি সর্বদা একটি রেফারেন্স এবং কখনই অস্থায়ী নয়।

  • auto const &এর মতো auto &&, তবে কেবল পঠনযোগ্য অ্যাক্সেস সরবরাহ করে।

আদিম / নন-আদিম ধরণের সম্পর্কে কী?

এখানে কোন পার্থক্য নেই.

এটি কি লুপের উপর ভিত্তি করে রেঞ্জের ক্ষেত্রেও প্রযোজ্য?

হ্যাঁ. উপরোক্ত নীতি প্রয়োগ করা,

  • auto &&লুপের মধ্যে ক্রমের মানগুলি সংশোধন ও বাতিল করতে সক্ষমতার জন্য ব্যবহার করুন । (এটি হ'ল, যদি না ধারকটি কেবল পঠনযোগ্য দর্শন সরবরাহ না করে, যেমন std::initializer_listকোনও ক্ষেত্রে এটি কার্যকরভাবে কার্যকর হবে auto const &))
  • auto &ক্রমটির মানগুলি অর্থবহ উপায়ে পরিবর্তন করতে ব্যবহার করুন ।
  • auto const &কেবলমাত্র পঠনযোগ্য অ্যাক্সেসের জন্য ব্যবহার করুন ।
  • auto(সংশোধনযোগ্য) অনুলিপিগুলির সাথে কাজ করার জন্য ব্যবহার করুন ।

আপনি auto constকোন রেফারেন্স সহ উল্লেখ। এটি কাজ করে, তবে এটি খুব বেশি ব্যবহৃত হয় না কারণ আপনি ইতিমধ্যে যে কোনও কিছুতে কেবল পঠনযোগ্য অ্যাক্সেস করার সুবিধা খুব কমই পাওয়া যায়।


সুটার বলেছে যে অটো ও ট্র্যাক্সেসের দৃness়তা
জেসি মরিচ

4
@ জেসিপিপার হ্যাঁ (যদিও কর্তৃপক্ষের কাছে আবেদন করা কিছুটা অদ্ভুত বিষয়।) আপনি কি এর নির্দিষ্ট অংশটি উল্লেখ করছেন?
পোটোটোওয়াতর

সংক্ষেপে auto&একটি ভাল পছন্দ বলে মনে হচ্ছে। তবে const auto&যখন আপনি ইতিমধ্যে সেখানে নেই এমন দৃ const়তা যুক্ত করতে চান তখন ব্যবহার করছেন । auto&&ফরোয়ার্ডিংয়ের জন্য, যা আমি মনে করি সাটারের চেয়ে বেশি প্রায়ই ঘটে। উদাহরণস্বরূপ, আপনি কোনও রিটার্ন মান সংরক্ষণ করতে auto&&এবং তারপরে এটি স্ট্যান্ড :: সিউটের মতো দুটি জিনিসে "ফরোয়ার্ড" করে ডিবাগিংয়ের মান দেখতে এবং এটি অন্য কোনও ফাংশনেও প্রেরণ করতে পারেন। আমি প্রায়শই অটো && ব্যবহার করতাম তবে এটি যখন কিছু অপ্রত্যাশিত কাজ করে তখন একবার বা দু'বার কামড়ে ধরেছিল। আমি কি ভুল হয়েছে আরও নোটিশ নিতে চান!
জেসি মরিচ

@JessePepper হ্যাঁ, auto&&যে একটি অনুপস্থিত ভাষা বৈশিষ্ট্য, এর সম্পর্কযুক্ত উচিত কোন বিবৃতি ছোট বিবৃতি ভাগে ভাগ করা করার অনুমতি দেয়। অনুপস্থিত অংশটি আজীবন বর্ধিতকরণ ... এটি ঠিক করার জন্য আমি বেশ চেষ্টা করেছি কিন্তু কেউ লক্ষ্য করেনি। পন্ডিত্রে খুব বেশি স্টক রাখবেন না :)
পটোটো ওয়াটার 20'18

অটো কনস্টে: অটো কনস্ট x = fn () লেখা আরও স্বাভাবিক হতে পারে; যদি আপনি জানেন যে ফাংশনটি কোনও রেফারেন্স দেয় না, এবং আপনি চান যে বাগটি এড়ানোর জন্য বা অবজেক্ট এক্সটি পরিবর্তন করা উচিত নয়, বা এটি সুযোগে ডকুমেন্টটি ব্যবহার করছে। একইভাবে আপনি সাধারণত লিখবেন না: কনট ইনট & এক্স = 1; তবে অটো কনস্ট্যান্ডগুলি এইভাবে ঘোষিত রেফারেন্সগুলির জন্য আজীবন বর্ধনের নিয়মের কারণে সমপরিমাণ ফলাফল দেয়।
স্পেসেন জ্যাসেট

47

হ্যাঁ, এটি ব্যবহার autoএবং auto&স্থানীয় ভেরিয়েবলগুলির জন্য সঠিক । কোনও ফাংশনের রিটার্ন টাইপ পাওয়ার সময় এটি ব্যবহার করাও সঠিক auto&। এটি লুপগুলির জন্যও ভিত্তিক ব্যাপ্তির জন্য প্রযোজ্য।

ব্যবহারের সাধারণ নিয়মগুলি হ'ল auto:

  • auto xআপনি যখন অনুলিপি নিয়ে কাজ করতে চান তা চয়ন করুন ।
  • auto &xআপনি যখন আসল আইটেমগুলির সাথে কাজ করতে চান তখন চয়ন করুন এবং সেগুলি সংশোধন করতে পারেন।
  • auto const &xআপনি যখন আসল আইটেমগুলির সাথে কাজ করতে চান তা চয়ন করুন এবং এগুলিকে সংশোধন করবেন না।

আপনি এখানে অটো স্পেসিফায়ার সম্পর্কে আরও পড়তে পারেন ।


10

autoটেমপ্লেট হিসাবে টাইপ ছাড়ের একই প্রক্রিয়া ব্যবহার করে, কেবলমাত্র ব্যতিক্রম যে আমি ব্রেস-আরআইএন তালিকাগুলি autoহিসাবে সচেতন, সেগুলি দ্বারা কেটে নেওয়া হয় std::initializer_list, তবে কোনও টেম্পলেট প্রসঙ্গে অ-ছাড় হয়।

auto x = expression;

প্রথমে সমস্ত রেফারেন্স এবং সিভি কোয়ালিফায়ারকে ডান হাতের অভিব্যক্তির প্রকারটি বাদ দিয়ে, তারপরে টাইপের সাথে মিলে কাজ করে। উদাহরণস্বরূপ, যদি আপনার const int& f(){...}এরপরে auto x = f();ছাড় xহয় int, এবং না const int&

অন্য ফর্ম,

auto& x = expression

সিভি-কোয়ালিফায়ারগুলিকে স্ট্রিপ করে না , সুতরাং উপরের উদাহরণটি ব্যবহার করে, হিসাবে auto& x = f()ছাড় দেয় । অন্যান্য সংমিশ্রণগুলি কেবল সিভি কোয়ালিফায়ার যুক্ত করে।xconst int&

আপনি যদি চান যে আপনার ধরণটি সর্বদা সিভি-রেফের বাছাইপরায়ণ হিসাবে কাটাতে decltype(auto)হয় তবে সি ++ 14-তে কুখ্যাত ব্যবহার করুন , যা decltypeটাইপ ছাড়ের নিয়ম ব্যবহার করে ।

সুতরাং, সংক্ষেপে, যদি আপনি অনুলিপি চান, ব্যবহার করুন auto, আপনি যদি উল্লেখ চান, ব্যবহার করুন auto&constআপনি যখনই অতিরিক্ত-বোধ করতে চান তখন ব্যবহার করুন const


সম্পাদনা করুন অতিরিক্ত ব্যবহারের কেস রয়েছে,

auto&& x = expression;

যা টেম্পলেট কোডে রেফারেন্স রেফারেন্সের ক্ষেত্রে যেমন রেফারেন্স-ভেঙে দেওয়া নিয়ম ব্যবহার করে। যদি expressionলভ্যালু হয়, তবে xএর সিভি-বাছাইকারীদের সাথে একটি লভ্যালু রেফারেন্স expression। যদি expressionকোনও মূল্যবোধ হয়, তবে xএটি একটি মূল্যসূত্র উল্লেখ।


@ পোটাটোসওয়াতর ধন্যবাদ, সম্পাদিত। আমি আসলে সিভি সম্পর্কে ভাবছি rvalues। পরীক্ষার কোন সহজ উপায় আছে? এবং আপনি কীভাবে সিভি-যোগ্য মান অর্জন করতে পারেন? ফাংশনে রিটার্ন সিভি বাতিল করা হয়।
বনসফটকো

না, এটি ফাংশন রিটার্নে বাতিল করা হয় না। এটি সমস্ত স্কেলার প্রকার (সি ++ 14 [এবং অন্যান্য সংস্করণ] §5 / 6) এর মূল্যগুলির জন্য বাতিল করা হয়েছে। আপনি একটি ফাংশন কল বা কাস্ট স্বরলিপি ব্যবহার করে একটি পেতে পারেন। সিভি-কোয়ালিফাইড এক্সভ্যালুগুলি অন্য যে কোনও কিছুর মতোই কাজ করে: auto && x = std::move< const int >( 5 );ঘোষণা করবে int const && xযদিও সেগুলি খুব কম ব্যবহৃত হয়।
পোটোটোওয়টার

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

স্কেলার প্রকারের জন্য বাতিল। পিওডিগুলি ক্লাস হতে পারে। যাইহোক, এটি এক্সপ্রেশন মডেল এবং অবজেক্ট মডেলের ছেদ করার একটি হ্যাকিশ কোণার।
পোটোটোভটার 13

2

স্থানীয় ভেরিয়েবলগুলি তৈরি করার সময়, (কনস্ট) অটো এবং অটো ব্যবহার করা কি সঠিক?

হ্যাঁ. স্বয়ংক্রিয়ভাবে সংকলক-অনুমিত প্রকার ব্যতীত আর কিছুই নয়, সুতরাং আপনি সাধারণত যেখানে রেফারেন্স ব্যবহার করেন সেগুলি এবং স্থানীয়ভাবে (স্বয়ংক্রিয়) অনুলিপিগুলি যেখানে আপনি সাধারণত স্থানীয় অনুলিপি ব্যবহার করবেন তা ব্যবহার করুন। কোনও রেফারেন্স ব্যবহার করা হবে না তা টাইপ ছাড়ের থেকে আলাদা।

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

আইনী? হ্যাঁ, কনস্টের সাথে ভাল অভ্যাস? সম্ভবত না, না। কমপক্ষে, সি ++ 11 দিয়ে নয়। বিশেষত না, যদি সোমমেথোদ () থেকে প্রাপ্ত মানটি ইতিমধ্যে একটি অস্থায়ী হয়। আপনি সি ++ 11 মুভ শব্দার্থবিজ্ঞান, অনুলিপি কপি, এবং মান অপ্টিমাইজেশন সম্পর্কে জানতে চাইবেন: https://juanchopanzacpp.wordpress.com/2014/05/11/ant-speed-dont-always-pass-by- মান /

http://www.informit.com/guides/content.aspx?g=cplusplus&seqNum=199

https://isocpp.org/wiki/faq/ctors#return-by-value-optimization

আদিম ধরণের সম্পর্কে কী? আমি কনট অটো যোগ = 1 + 2 ধরে নিই; সঠিক.

হ্যাঁ, এটা ঠিক আছে।

এটি কি লুপের উপর ভিত্তি করে রেঞ্জের ক্ষেত্রেও প্রযোজ্য?

(কনস্টেট অটো এবং অবজেক্ট: অবজেক্টস) জন্য

হ্যাঁ, এটিও ঠিক আছে। আমি কাজের সময়ে এই ধরণের কোডটি লিখি।

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