সি ++ 11 অটো কীওয়ার্ডের সাহায্যে কত বেশি?


218

আমি autoজটিল টেম্পলেটযুক্ত ধরণের জন্য সি ++ 11 স্ট্যান্ডার্ডে উপলব্ধ নতুন কীওয়ার্ডটি ব্যবহার করছি যা আমি বিশ্বাস করি এটি এর জন্য ডিজাইন করা হয়েছিল। তবে আমি এটি এ জাতীয় জিনিসের জন্যও ব্যবহার করছি:

auto foo = std::make_shared<Foo>();

এবং আরও সন্দেহজনকভাবে এর জন্য:

auto foo = bla(); // where bla() return a shared_ptr<Foo>

আমি এই বিষয় নিয়ে তেমন আলোচনা দেখিনি। মনে হয় এটি অতিরিক্ত ব্যবহার করা autoযেতে পারে, যেহেতু একটি টাইপ প্রায়শই ডকুমেন্টেশন এবং স্যানিটি চেকগুলির ফর্ম। আপনি কোথায় ব্যবহার করতে রেখাটি আঁকেন autoএবং এই নতুন বৈশিষ্ট্যের জন্য প্রস্তাবিত ব্যবহারের ক্ষেত্রে কী কী?

স্পষ্ট করার জন্য: আমি দার্শনিক মতামত চাইছি না; আমি স্ট্যান্ডার্ড কমিটি দ্বারা এই কীওয়ার্ডটির উদ্দেশ্যমূলক ব্যবহারের জন্য জিজ্ঞাসা করছি, সম্ভবত এই উদ্দেশ্যে ব্যবহারটি বাস্তবে কীভাবে উপলব্ধি হবে সে সম্পর্কে মন্তব্য সহ।

পার্শ্ব দ্রষ্টব্য: এই প্রশ্নটি SE.Programmers এবং তারপর স্ট্যাক ওভারফ্লোতে ফিরে গেছে। এ সম্পর্কে আলোচনা এই মেটা প্রশ্নে পাওয়া যাবে ।


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

15
@ এই, আমি একটি স্পষ্টতা যোগ করেছি। আপনি যদি প্রশ্নটি খুব সাধারণভাবে পড়ে থাকেন তবে মনে হয় এটি একটি সাবজেক্টিভ মতামত জিজ্ঞাসা করছে, তবে সত্যিই যদি আপনি autoকীওয়ার্ডটি ব্যবহার করেন , তবে আপনি কীভাবে এটি ব্যবহার করার কথা বলেছিলেন তা আপনি জানেন । আমি যা বলছি, এই বৈশিষ্ট্যে নতুন কেউ হিসাবে আমি কীভাবে এটি ব্যবহার করব?
অ্যালান টুরিং

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

2
@ লেক্স: হয় কিছু আইনী বা তা নয়; "খারাপ" যেটিকে আইনী বলে অভিহিত করা সংজ্ঞা অনুসারে বিষয়বস্তু। অর্থাৎ, auto foo = bla();"খারাপ" বলা স্পষ্টভাবে একটি মতামত, কোনও সত্য নয়, যা এই প্রশ্নটি তৈরি করে এবং একটি আলোচনার উত্তর দেয় যা এটি প্রোগ্রামার এসই-এর সাথে প্রাসঙ্গিক করে তোলে, যা নিকটতম ভোটগুলি নির্দেশ করে ঠিক এটিই। /
শ্রাগ

উত্তর:


131

আমি মনে করি যে autoযখনই প্রথম দেখাতে টাইপটি লিখতে হয় তবে এটির পক্ষে কীওয়ার্ডটি ব্যবহার করা উচিত তবে এক্সপ্রেশনটির ডান হাতের প্রকারটি স্পষ্ট। উদাহরণস্বরূপ, ব্যবহার করে:

my_multi_type::nth_index<2>::type::key_type::composite_key_type::
    key_extractor_tuple::tail_type::head_type::result_type

সম্মিলিত কী টাইপটি পেতে boost::multi_index, যদিও আপনি জানেন যে এটি int। আপনি কেবল লিখতে পারবেন না intকারণ এটি ভবিষ্যতে পরিবর্তিত হতে পারে। আমি autoএই ক্ষেত্রে লিখতে হবে ।

সুতরাং যদি autoকোনও বিশেষ ক্ষেত্রে কীওয়ার্ডটি পঠনযোগ্যতার উন্নতি করে তবে এটি ব্যবহার করুন। autoকোন ধরণের autoপ্রতিনিধিত্ব করে তা পাঠকের কাছে স্পষ্ট হয়ে গেলে আপনি লিখতে পারেন ।

এখানে কিছু উদাহরন:

auto foo = std::make_shared<Foo>();   // obvious
auto foo = bla();                     // unclear. don't know which type `foo` has

const size_t max_size = 100;
for ( auto x = max_size; x > 0; --x ) // unclear. could lead to the errors
                                      // since max_size is unsigned

std::vector<some_class> v;
for ( auto it = v.begin(); it != v.end(); ++it )
                                      // ok, since I know that `it` has an iterator type
                                      // (don't really care which one in this context)

18
এটি খুব ভাল সুপারিশ বলে মনে হয় না। কত ঘন ঘন আপনি বস্তুর ধরণ জানেন না? (টেম্পলেটগুলির বাইরে, এটি)
পল মানতা

9
@ পল: প্রায়শই আপনি কেবলমাত্র টাইপের সর্বাধিক গুরুত্বপূর্ণ অংশটি জানতে বা কেবল জানতে প্রয়োজন, উদাহরণস্বরূপ যে এটি একটি পুনরুক্তিকারী, তবে আপনি জানেন না এবং এটি যত্ন নিতে পারেন না এটি ভেক্টরগুলির পুনরুক্তিকারী বা লিঙ্কটির পুনরাবৃত্তকারী কিনা তালিকা; এই ক্ষেত্রে, আপনি কীভাবে টাইপগুলি লিখবেন তা বোঝার চেষ্টা করে সত্যই সময় এবং পর্দার স্থান ব্যয় করতে চান না।
মিথ্যা রায়ান

45
সি ++ ডায়ারহার্ডস এটি পছন্দ করবে বা না, সি ++ 0x এমন লোকদের আকর্ষণ করবে যারা কখনও সি ++ ব্যবহার করেন নি। এবং এগুলি পুরো জায়গা জুড়ে অটো ব্যবহার করবে।
অধ্যাপক ফ্যালকেন

6
@ আর.মার্টিনহো ফার্নান্দেস - না, কেবলমাত্র একটি বিষয় পরিষ্কার যে আপনি যা bla() ফিরিয়ে দিচ্ছেন তা হ'ল foo
লুইস মাচুকা

8
@ লুইস মাচুচা আমার জবাবটি জিভ-ইন-গাল বলার মতো ছিল যে খারাপ ভেরিয়েবল এবং ফাংশন নামকরণের পাঠ্যপুস্তকের উদাহরণ দেওয়া এবং প্রকারের অনুক্রমের পাঠ্যতার অভাবকে দোষারোপ করা বেonমান।
আর মার্টিনহো ফার্নান্দেস

62

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


12
আমি বিশেষত 'কনস্ট্যান্ড অটো এবং' বলব
ভিক্টর সেহর

2
auto&&জটিল পরিস্থিতিতে আরও ভাল ব্যবহার করুন edmundv.home.xs4all.nl/blog/2014/01/28/…
KindDragon

2
@KindDragon: তা একটি চলতি নিয়ম, কিন্তু আমি ব্যবহার করতে পছন্দ const auto&বা const autoযদি না আমি স্পষ্টভাবে পরিবর্তন ঘটান বা স্থানান্তর করতে চান।
জন পুর্ডি

" আপনি যেদিকেই পারেন অটো ব্যবহার করুন "। এর অর্থ কি আমার auto str = std::string();বদলে লেখা উচিত std::string str;?
কলমারিয়াস

4
সমস্ত জায়গায় অটো ব্যবহার করা আপনার কোডটি কম পঠনযোগ্য এবং ডিবাগ করা আরও শক্ত করে তুলবে কারণ কোডটি পড়ার সময় আপনাকে নিজের প্রকারগুলি নিজেই কাটাতে হবে।
সাবম্যাচাইন

52

সহজ। আপনি কী ধরণের তা যত্নশীল না করার সময় এটি ব্যবহার করুন । উদাহরণ স্বরূপ

for (const auto & i : some_container) {
   ...

আমি এখানে কেবল যত্ন করি iতা কেবল পাত্রে যা থাকে।

এটি কিছুটা টাইপফের মতো।

typedef float Height;
typedef double Weight;
//....
Height h;
Weight w;

এখানে, আমি পরোয়া করি না কিনা hএবং wহয় ভাসে বা দ্বিগুণ তারা শুধু তাই যাই হোক না কেন টাইপ উচ্চতা এবং ওজন প্রকাশ করার উপযুক্ত

বা বিবেচনা করুন

for (auto i = some_container .begin (); ...

এখানে আমি যা যত্ন করি তা হ'ল এটি একটি উপযুক্ত পুনরাবৃত্তিকারী, সমর্থনকারী operator++(), এটি এক প্রকারের মতো এই ক্ষেত্রে হাঁসের টাইপ করা।

এছাড়াও ল্যাম্বডাসের ধরণটি বানান করা যায় না, তাই auto f = []...ভাল স্টাইল। বিকল্পটি কাস্টিং হচ্ছে std::functionতবে তা ওভারহেডের সাথে আসে।

আমি সত্যিই একটি "আপত্তিজনক" ধারণা করতে পারি না auto। নিকটতম আমি কল্পনা করতে পারি নিজেকে কিছু উল্লেখযোগ্য ধরণের কাছে একটি পরিষ্কার রূপান্তর থেকে বঞ্চিত করা - তবে আপনি এটির autoজন্য ব্যবহার করবেন না , আপনি পছন্দসই ধরণের একটি অবজেক্ট তৈরি করবেন।

পার্শ্ব প্রতিক্রিয়া না পরিচয় দিয়ে যদি আপনি আপনার কোডের কিছু অপ্রয়োজনীয়তা সরিয়ে ফেলতে পারেন তবে তা করা ভাল must

পাল্টা উদাহরণ (অন্য কারও উত্তর থেকে ধার করা):

auto i = SomeClass();
for (auto x = make_unsigned (y); ...)

এখানে আমরা কী ধরণের তা যত্নশীল করি তাই আমাদের লেখা উচিত Someclass i;এবংfor(unsigned x = y;...


1
উম। এত সহজ নয়. এটি সংকলন করে চলে এবং আপনি যদি কেবল আইটেমগুলি অনিয়ন্ত্রিত বস্তুগুলিতে পড়ে থাকেন তবে আপনি কেবল নিজের পায়ে গুলি করেছেন - আপনার পুনরাবৃত্তিকে পুনরাবৃত্তির প্রতিটি ধাপে অনুলিপি কন্সট্রাক্টর এবং ডেস্ট্রাক্টর বলে। যদি আপনি কোনও পরিসীমা ভিত্তিক পুনরুদ্ধারকারীকে অন্ধভাবে অটো ব্যবহার করতে চলেছেন তবে এটি সম্ভবত "ফর (অটো আইটেম: কিছু_সামগ্রহকারী)" এর পরিবর্তে "(কনট অটো এবং আইটেম: কিছু_সামগ্রহকারী)" হওয়া উচিত।
ডন হ্যাচ

2
সবসময় নয়, তবে ঠিক আছে আপনি সম্ভবত উল্লেখগুলি চান। তাতে কি? এর সাথে কিছুই করার নেইauto
12:25 এ স্প্রেফ

আমি আপনার শেষ মন্তব্যটি সত্যিই বুঝতে পারি না। আমি ব্যাখ্যা করার চেষ্টা করেছি যে আপনার কৌশলটি কেন আমার কাছে খুব ভাল মত লাগে না এবং কেন আমি এটিকে নীচে নামছি।
ডন হ্যাচ

5
আমি বলছি যে আপনি রেফারেন্স ব্যবহার করেন বা না করেন আপনি অটো ব্যবহার করেন কিনা তা থেকে অরথোগোনাল। আমি এটি সম্পাদনা করবো রেফারেন্স যুক্ত করার জন্য কারণ স্বীকার করা হয় যে সাধারণত কেউ যা করতে চায় তা কিন্তু এটি হাতে থাকা বিষয়টির সাথে সম্পূর্ণ অপ্রাসঙ্গিক।
spraff

43

এটার জন্য যাও. ব্যবহারের autoজন্য যে কোন জায়গায় এটা কোড সহজ লেখা তোলে।

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

তবে আমি যদি কয়েক লাইনের মতো কোডের সাথে কাজ করতাম

auto foo = bla();

যেখানে টাইপটি শূন্য বার নির্দেশিত হয়, আমি সেই লাইনগুলি প্রকারগুলিতে অন্তর্ভুক্ত করতে চাইব want টাইপটি একবারে বর্ণিত হওয়ার পরে প্রথম উদাহরণটি দুর্দান্ত, এবং autoদু'বার অগোছালো টেম্প্লেটেড টাইপ লেখার হাত থেকে বাঁচায়। সি ++++ এর জন্য হুরয়। তবে স্পষ্টভাবে শূন্য বার প্রকারটি প্রদর্শন করা, যদি এটি কোনও নিকটবর্তী লাইনে সহজেই দৃশ্যমান না হয় তবে আমাকে ঘাবড়ান করে তোলে, কমপক্ষে সি ++ এবং এর তত্ক্ষণাতিক উত্তরসূরীগুলিতে। আরও বিমূর্ততা, বহুকর্ম এবং উদারতা সহ একটি উচ্চ স্তরে কাজ করার জন্য ডিজাইন করা অন্যান্য ভাষাগুলির জন্য, এটি ঠিক আছে।


38

সি ++ এবং বিয়ন্ড 2012 সালে জিজ্ঞাসা করুন আমাদের যেকোনো কিছু প্যানেল, একটি ছিল আন্দ্রেই Alexandrescu, স্কট মায়ার্স এবং ঔষধি Sutter মধ্যে চমত্কার বিনিময় যখন ব্যবহার এবং ব্যবহার করবেন বিষয়ে কথাauto । 4 মিনিটের আলোচনার জন্য মিনিট 25:03 এ যান। তিনটি স্পিকারই দুর্দান্ত পয়েন্ট দেয় যা কখন ব্যবহার করবেন না সে সম্পর্কে মনে রাখা উচিত auto

আমি লোকদের তাদের নিজস্ব সিদ্ধান্তে আসতে উত্সাহিত করি, তবে আমার গ্রহণটি সর্বত্র ব্যবহারauto করা উচিত যদি না :

  1. এটি পঠনযোগ্যতা ব্যথা করে
  2. স্বয়ংক্রিয় ধরণের রূপান্তর সম্পর্কে উদ্বেগ রয়েছে (যেমন কনস্ট্রাক্টর, অ্যাসাইনমেন্ট, টেম্পলেট মধ্যবর্তী ধরণের, পূর্ণসংখ্যার প্রস্থের মধ্যে অন্তর্ভুক্ত রূপান্তর)

উদার উদার ব্যবহার explicitপরবর্তীকালের জন্য উদ্বেগ হ্রাস করতে সহায়তা করে, যা পূর্ববর্তী কোনও সমস্যা হওয়ার সময়কে হ্রাস করতে সহায়তা করে।

হার্ব যা বলেছিল তা পুনরায় প্রকাশ করে, "আপনি যদি এক্স, ওয়াই এবং জেড না করেন তবে ব্যবহার করুন autoX এক্স, ওয়াই ও জেড কী কী তা শিখুন এবং এগিয়ে যান এবং autoঅন্য কোথাও ব্যবহার করুন " "


4
সম্ভবত "প্রায় সর্বদা অটো" - এর সাথে যুক্ত হওয়ার মতো মূল্যও রয়েছে
রব স্টার্লিং

37

হ্যাঁ, এটি পঠনযোগ্যতার ক্ষতির দিকে অতিরিক্ত ব্যবহার করা যেতে পারে। আমি এটিকে প্রসঙ্গগুলিতে ব্যবহারের পরামর্শ দিচ্ছি যেখানে সঠিক প্রকারগুলি দীর্ঘ, বা অপরিবর্তনীয়, বা পঠনযোগ্যতার জন্য গুরুত্বপূর্ণ নয় এবং পরিবর্তনশীলগুলি স্বল্পস্থায়ী। উদাহরণস্বরূপ, পুনরাবৃত্তকারী টাইপ সাধারণত দীর্ঘ হয় এবং গুরুত্বপূর্ণ নয়, তাই autoকাজ করবে:

   for(auto i = container.begin(); i != container.end(); ++i);

auto এখানে পাঠযোগ্যতা ক্ষতি করে না।

আর একটি উদাহরণ পার্সার রুল টাইপ, যা দীর্ঘ এবং সংশ্লেষিত হতে পারে। তুলনা করা:

   auto spaces = space & space & space;

সঙ্গে

r_and_t<r_and_t<r_char_t<char>&, r_char_t<char>&>, r_char_t<char>&> spaces = 
   space & space & space;

অন্যদিকে, যখন টাইপটি পরিচিত এবং সহজ, এটি স্পষ্টভাবে বর্ণিত থাকলে এটি আরও ভাল:

int i = foo();

বরং

auto i = foo();

2
অবশ্যই, ভাষায় লুপের জন্য একটি পরিসীমা ভিত্তিক থাকা আপনার প্রথম উদাহরণটিকে কম উত্তেজনাপূর্ণ করে তোলে। 8 ভি)
ফ্রেড লারসন

@ ফ্রেড: প্রকারটি এখনও জটিল হতে পারে (আমি সহযোগী পাত্রে চিন্তা করছি)
ম্যাথিউ এম।

3
@ ফ্রেড: যে কোনও সময় আপনার সীমানা না থাকে begin()এবং end()বা আপনার ধাপের আকারটি ব্যতীত অন্য কোনও কিছু হয়, বা আপনি লুপ করার সাথে সাথে ধারকটি সংশোধন করছেন, বিবৃতি দেওয়ার জন্য পরিসর-ভিত্তিক আপনাকে সাহায্য করবে না।
ডেনিস জিকিফুজ

6
@ জোটাভ্রোস: এবং r_and_t<r_and_t<r_char_t<char>&, r_char_t<char>&>, r_char_t<char>&>না?
ডেনিস জিকফুজ

7
@ জোটাভ্রোস: বা আপনি কী ধরণের spaceতা দেখতে পারেন এবং এটির জন্য অনুসন্ধান করতে পারেন । এটাই যেহেতু আরও দরকারী তথ্য ... সর্বোপরি, সমস্যাটি "এই নতুন পরিবর্তনশীলটি কী ধরণের" নয় বরং "এর space & space & spaceঅর্থ কী?" প্রকাশের আসল ধরণটি কেবল গোলমাল।
ডেনিস জিকফুজ

19

auto এক্সপ্রেশন টেম্পলেটগুলির সাথে মিশ্রণে খুব বিপজ্জনক হতে পারে যা ইগেন বা ওপেনসিভি এর মতো লিনিয়ার বীজগণিত গ্রন্থাগারগুলি দ্বারা প্রচুর ব্যবহৃত হয়।

auto A = Matrix(...);
auto B = Matrix(...);
auto C = A * B; // C is not a matrix. It is a matrix EXPRESSION.
cout << C; // The expression is evaluated and gives the expected result.
... // <code modifying A or B>
cout << C; // The expression is evaluated AGAIN and gives a DIFFERENT result.

এই ধরণের ভুল দ্বারা সৃষ্ট বাগগুলি ডিবাগ করার জন্য একটি বড় ব্যথা। একটি সম্ভাব্য প্রতিকার হ'ল আপনি যদি বাম-থেকে-ডান ঘোষণার শৈলীর জন্য স্বয়ংক্রিয় ব্যবহার করতে নারাজ হন তবে প্রত্যাশিত ধরণের ফলাফলটি স্পষ্টভাবে ছড়িয়ে দেওয়া।

auto C = Matrix(A * B); // The expression is now evaluated immediately.

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

1
A*Bঅভিব্যক্তিটি কোনও autoচলক বা অন্য কিছুতে অনুলিপি করা হোক বা না হোক , আপনার বর্ণনার আচরণটি এখনও বিদ্যমান is
xtofl

কোন বাগ সংশোধন করা হয় সৃষ্ট ব্যবহার করে auto
জিম বাল্টার

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

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

10

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

auto i = MyClass();

পরিবর্তে

MyClass i;

এটি এমন একটি ক্ষেত্রে যেখানে আমি বলব এটি autoকীওয়ার্ডের অপব্যবহার ।

প্রায়শই আমি আপত্তি করি না সঠিক জিনিসটি কী, আমি তার ফাংশনালিটির বিষয়ে আরও আগ্রহী এবং ফাংশন নামগুলি সাধারণত যে জিনিসগুলি তারা ফেরত autoদেয় সে সম্পর্কে কিছু বলে, আঘাত করে না: উদাহরণস্বরূপ auto s = mycollection.size(), আমি অনুমান করতে পারি যে এটি sহবে এক ধরণের পূর্ণসংখ্যার, এবং বিরল ক্ষেত্রে যেখানে আমি সঠিক টাইপটি যত্ন করি, তার পরে ফাংশন প্রোটোটাইপটি পরীক্ষা করে দেখি (মানে, কোডটি লেখার সময় একটি প্রাইরির চেয়ে আমার যখন তথ্য প্রয়োজন তখন তা পরীক্ষা করতে পছন্দ করি, ঠিক যদি কোনও দিন এটি কার্যকর হয় তবে int_type s = mycollection.size())।

গৃহীত উত্তর থেকে এই উদাহরণটি সম্পর্কিত:

for ( auto x = max_size; x > 0; --x )

আমার কোডে আমি এখনও autoএই ক্ষেত্রে ব্যবহার করি এবং যদি আমি xস্বাক্ষরবিহীন হতে চাই , তবে আমি বলি নামক একটি ইউটিলিটি ফাংশন ব্যবহার করি make_unsignedযা আমার উদ্বেগকে স্পষ্টভাবে প্রকাশ করে:

for ( auto x = make_unsigned(max_size); x > 0; --x )

দাবি অস্বীকার: আমি কেবল আমার ব্যবহারের বর্ণনা দিই , আমি পরামর্শ দেওয়ার পক্ষে সক্ষম নই!


1
@ ক্রিশ্চিয়ানআউ: ব্যঙ্গাত্মক ছিল না। মনে রাখবেন যে আমি ব্যবহারের প্রস্তাব দিইনি auto i = MyClass()
রাফাক

3
ফলোআপ: দেখুন: herbsutter.com/2013/06/13/… । উদাহরণস্বরূপ ব্যবহারের as_unsignedপ্রস্তাব এখানে বা এমনকি দেওয়া হয় auto w = widget{};
রাফাক

3

এক প্রধান সি ++ প্রোগ্রামের সাথে সমস্যা এটা আপনি ব্যবহার করতে দেয় uninitialized পরিবর্তনশীল । এটি আমাদেরকে বাজে নন-ডিস্ট্রিমেন্টিক প্রোগ্রাম আচরণের দিকে নিয়ে যায়। এটি লক্ষ্য করা উচিত যে আধুনিক সংকলক এখন যথাযথ / বার্তা সতর্কতা বার্তা নিক্ষেপ করে যদি প্রোগ্রামটি এটি ব্যবহার করতে ক্লান্ত হয়।

কেবল এটি চিত্রিত করতে সি ++ প্রোগ্রামের নীচে বিবেচনা করুন:

int main() {
    int x;
    int y = 0;
    y += x;
}

আমি যদি আধুনিক সংকলক (জিসিসি) ব্যবহার করে এই প্রোগ্রামটি সংকলন করি তবে এটি সতর্কতা দেয়। যদি আমরা প্রকৃত জটিল উত্পাদন কোডের সাথে কাজ করে থাকি তবে এই ধরনের সতর্কতা খুব সুস্পষ্ট নাও হতে পারে।

main.cpp: ফাংশনে 'int main ()':

main.cpp: 4: 8: সতর্কতা : 'এক্স' এই ফাংশনে অবিচ্ছিন্নভাবে ব্যবহৃত হয় [-উইনিটায়ালাইজড]

y + = x;

    ^

================================================== ============================== এখন যদি আমরা আমাদের প্রোগ্রামটি স্বয়ংক্রিয়ভাবে ব্যবহার করে তা পরিবর্তন করি তবে সংকলিত আমরা নিম্নলিখিতটি পেতে পারি:

int main() {
    auto x;
    auto y = 0;
    y += x;
}

main.cpp: ফাংশনে 'int main ()':

main.cpp: 2: 10: ত্রুটি : 'অটো এক্স' এর ঘোষণার কোনও আরম্ভকারী নেই

 auto x;

      ^

অটো দিয়ে, অবিচ্ছিন্ন ভেরিয়েবল ব্যবহার করা সম্ভব নয়। এই প্রধান সুবিধা যা আমরা (বিনামূল্যে জন্য) পেতে পারেন যদি আমরা ব্যবহার শুরু হয় স্বয়ংক্রিয়

এই ধারণাটি এবং অন্যান্য দুর্দান্ত আধুনিক সি ++ ধারণাটি সি ++ বিশেষজ্ঞ হার্ব শাটার তার সিপিসকন 14 টকটিতে ব্যাখ্যা করেছেন :

বুনিয়াদি ফিরে! আধুনিক সি ++ স্টাইলের প্রয়োজনীয়তা


2
হ্যাঁ. এবং প্রকারটি নির্দিষ্ট করতে আপনি 0 i, 0u, 0l, 0ul, 0.0f, 0.0, বা এমনকি int (), স্বাক্ষরবিহীন (), ডাবল (), ইত্যাদি হিসাবে শুরু করতে পারেন
রবিনসন

6
এই যুক্তি হাস্যকর। আপনি বলছেন "আপনি আরম্ভকারীটি ভুলতে পারবেন না কারণ আপনি একটি সংকলক ত্রুটি পাবেন", তবে এটির জন্য আপনাকে ব্যবহারের কথা মনে রাখা দরকার auto
অরবিটে

1
@ লাইটনেসেসেসিন অরবিত: হার্ব সটার আলাপ থেকে আমি এই ধারণাটি উপলব্ধি করেছি (শিখেছি)। আমি এটি ভেষজ আলাপ থেকে যৌক্তিক / ব্যবহারিক পরামর্শ পেয়েছি, সুতরাং সম্প্রদায়ের সাথে ভাগ করে নেওয়ার কথা ভেবেছি।
মনটোশ কুমার

2
অটো ব্যবহারের পক্ষে এটি ভাল অনুপ্রেরণা বলে আমি মনে করি না। অবিচ্ছিন্ন ভেরিয়েবলগুলি ব্যবহারের জন্য কেবল আপনার সংকলকটির সতর্কতা পতাকাটি চালু করুন এবং সমস্ত সতর্কতাগুলিকে সম্বোধন করুন। এটি আপনার ব্যবহার করা উচিত নয় তা বলার অপেক্ষা রাখে নাauto - তবে এই সমস্যাটি এড়াতে আপনার এটির দরকার নেই।
einpoklum

2

একটি বিপদ যে বিষয়টি আমি উল্লেখ করেছি তা হল রেফারেন্সের শর্তে। যেমন

MyBigObject& ref_to_big_object= big_object;
auto another_ref = ref_to_big_object; // ?

সমস্যা অন্য_রেফ আসলে এই ক্ষেত্রে কোনও রেফারেন্স নয় এটি মাইবিগঅবজেক্ট এবং এর পরিবর্তে মাইবিগঅবজেক্ট। আপনি কোনও বড় অবজেক্টটি উপলব্ধি না করে অনুলিপি করতে পারেন।

আপনি যদি কোনও পদ্ধতি থেকে সরাসরি রেফারেন্স পান তবে আপনি এটি আসলে কী তা সম্পর্কে ভাবতে পারেন না।

auto another_ref = function_returning_ref_to_big_object();

আপনার প্রয়োজন হবে "অটো &" বা "কনস্ট অটো এবং"

MyBigObject& ref_to_big_object= big_object;
auto& another_ref = ref_to_big_object;
const auto& yet_another_ref = function_returning_ref_to_big_object();

1

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

যাইহোক এটি আমার মতামত।


4
"যেখানে এটি বোধগম্য হয় ..." এটি একটি জটিল অংশ। প্রোগ্রামারগণ কোডিংয়ের বিশদগুলিতে এতটাই ধরা পড়তে পারে, তারা ভবিষ্যতের নির্দিষ্ট রক্ষণাবেক্ষণকারীদের অন্যান্য প্রোগ্রামারদের কী বোঝায় তা হারায়।
DarenW

এটি সত্য, যদিও আমি মনে করি এটি কখন অস্পষ্ট তা বলা সহজ easy সন্দেহ হলে, একটি মন্তব্য ব্যবহার করুন!
LainIwakura

1
এটি কোনও প্রকারটি ব্যবহার করে বোঝাবে না?
মিখাইল

কিছু বিকাশকারী বলতেন যে টাইপটি সর্বদা অনুমান করা উচিত !
আরাফ্যাজিওন

একটি মন্তব্য ব্যবহার করুন ...... অথবা কেবল টাইপটি ব্যবহার করুন এবং কোনও মন্তব্যের প্রয়োজন নেই?
ব্যবহারকারী 997112

1

autoমূলশব্দটি কেবল স্থানীয় ভেরিয়েবলের জন্য ব্যবহার করা যেতে পারে, তর্ক বা শ্রেণি / কাঠামোর সদস্যদের জন্য নয়। সুতরাং, এটি আপনার পছন্দ মতো যেকোন জায়গায় ব্যবহার করা নিরাপদ এবং কার্যকর। আমি তাদের অনেক ব্যবহার করি টাইপটি সংকলন করার সময় নির্ধারণ করা হয়, ডিবাগিংয়ের সময় প্রকারটি প্রদর্শন করা হয়, sizeofসঠিকভাবে প্রতিবেদন করা হয়, decltypeসঠিক টাইপটি দেয় - কোনও ক্ষতি নেই। আমি কখনই অতিরিক্ত ব্যবহারের মতো গণনা করি না auto!


0

টিএল; ডিআর: নীচের দিকে নিয়মের অফ থাম্ব দেখুন।

গৃহীত উত্তর চলতি নিম্নলিখিত নিয়ম প্রস্তাব দেওয়া:

ব্যবহারের autoযখনই কঠিন বলে প্রথম দর্শনে টাইপ লিখতে কিভাবে, কিন্তু একটি অভিব্যক্তি ডান দিকে ধরণ সুস্পষ্ট।

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

auto x = f();

কী এটিকে অপব্যবহারের উদাহরণ করে auto? এটা কি আমার f()রিটার্ন টাইপ সম্পর্কে অজ্ঞতা ? ঠিক আছে, আমি যদি এটি জানতাম তবে এটি সত্যিই সহায়তা করতে পারে তবে এটি আমার প্রধান উদ্বেগ নয়। সমস্যাটির থেকে বেশি যা হ'ল তা হ'ল xএবং f()অর্থহীন। যদি আমাদের ছিল:

auto nugget = mine_gold();

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

সুতরাং আমার উত্তরটি হ'ল: autoযখনই সংকলক এটির অনুমতি দেয় তখন ব্যবহার করুন :

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

এবং যদিও:

  • autoকংক্রিটের ধরণটি প্রতিস্থাপনের আগে অর্থবহ নাম (যা অবশ্যই প্রকারের নাম ধারণ করে না) দেওয়া পছন্দ করুন ।

-3

আমার তিক্ত অভিজ্ঞতার একটি autoহ'ল ল্যাম্বদা এক্সপ্রেশন সহ এটি ব্যবহার করা :

auto i = []() { return 0; };
cout<<"i = "<<i<<endl; // output: 1 !!!

আসলে, এখানে iপয়েন্টার ফাংশন সমাধান করা হয় int(*)()। এটি কেবল একটি সহজ cout, তবে এটি ব্যবহার করার সময় এটি কী ধরণের খারাপ সংকলন / রানটাইম ত্রুটিগুলির কারণ হতে পারে তা কল্পনা করুন template

আপনার এ জাতীয় অভিব্যক্তিগুলি এড়ানো উচিত autoএবং সঠিক returnধরণের (বা নিয়ন্ত্রিত decltype()) করা উচিত

উপরের উদাহরণের জন্য সঠিক ব্যবহার হ'ল,

auto i = []() { return 0; }(); // and now i contains the result of calling the lambda  

7
অটোতে এর কী কী আছে তা বোঝানোর জন্য আপনি একটি ভয়ানক কাজ করেছিলেন। আপনি একটি ফাংশন তৈরি করে মুদ্রণ করেছেন ... ঠিক আছে?
ডেনিস জিকফুজ

5
@ আইয়ামিলিন্ড: এবং অটোতে এর সাথে কী করার আছে?
আর মার্টিনহো ফার্নান্দেস

7
আমি একেবারে অসম্ভব বলে মনে করি যে কেউ ()শেষ পর্যন্ত রাখতে চাইবে । লাম্বডাস সেখানে ফাংশন হিসাবে কাজ করতে পারে এবং সেখানেই ফাংশন পয়েন্টার রূপান্তরটি আসে। আপনি যদি সরাসরি এটিকে কল করতে চান তবে কেন একটি ল্যাম্বডা ব্যবহার করবেন? auto i = 0;বরং ভাল কাজ করে।
আর মার্টিনহো ফার্নান্দেস

4
লাম্বদা ছাড়া আপনি কি কমপক্ষে এমন দৃশ্যের বর্ণনা দিতে পারেন যেখানে একই জিনিসটির auto x = []() { /* .... whatever goes in here ... */ }()চেয়ে ভাল auto x = /* .... whatever goes in here ... */;? আমি এটি বরং অর্থহীন বলে মনে করি, একই কারণে auto x = 42 + y - 42অর্থহীন।
আর মার্টিনহো ফার্নান্দেস

6
-1 এটি অটো দোষ নয়। ল্যাম্বডা টাইপের বানান করা যায় না সুতরাং অটো দরকার হয় , যদি আপনি ফাংশনটি কল করতে ভুলে যান তবে এটি আপনার নিজস্ব চেহারা! আপনি একটি অ-কথিত ফাংশন পয়েন্টারটি ঠিক একটি সি প্রিন্টফের মধ্যে ঠিক তেমনি অবাস্তবভাবে রাখতে পারেন।
স্প্রেফ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.