সি ++ অটো কীওয়ার্ড। কেন যাদু?


144

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

হঠাৎ এসটিএল পুনরাবৃত্তকারী এবং, ভাল, টেমপ্লেট ব্যবহার করে যে কোনও কিছু লিখতে 10 গুণ বেশি সহজ। মনে হচ্ছে আমি পাইথনের মতো 'মজাদার' ভাষা ব্যবহার করছি।

এই কীওয়ার্ডটি আমার পুরো জীবন কোথায় ছিল? আপনি কি ভিজ্যুয়াল স্টুডিওর জন্য একচেটিয়া না পোর্টেবল নয় তা বলে আমার স্বপ্নগুলিকে ছাপিয়ে দেবেন?


18
এটা না। জাদু। এটি নতুন ( ওহ নোস, কী খারাপ শঙ্কা )। এখন ASYNC ভবিষ্যৎ (হয় খাবি )
sehe

2
এখানে স্বয়ংক্রিয় কীওয়ার্ডগুলি সম্পর্কে উল্লেখ করা হয়েছে en.cppreferences.com/w/cpp/language/auto
andyqee

উত্তর:


149

auto সি থেকে এমন একটি মূলশব্দ যা সি ++ "উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল" যা প্রায় চিরকালই ছিল, তবে কার্যত কখনও ব্যবহৃত হয়নি কারণ সেখানে দুটি সম্ভাব্য শর্ত ছিল: হয় এটির অনুমতি ছিল না, অন্যথায় এটি ডিফল্টরূপে ধরে নেওয়া হয়েছিল।

autoএকটি ছাড়ের ধরণের অর্থের ব্যবহারটি সি ++ 11 এর সাথে নতুন ছিল।

একই সময়ে, auto x = initializerধরণ deduces xধরণ থেকে initializerফাংশন টেমপ্লেটের জন্য টেমপ্লেট প্রকার সিদ্ধান্তগ্রহণ কাজ হিসাবে একই উপায়। এই মত একটি ফাংশন টেমপ্লেট বিবেচনা করুন:

template<class T>
int whatever(T t) { 
    // point A
};

পয়েন্ট এ এ, Tপরামিতিটির জন্য প্রদত্ত মানের উপর ভিত্তি করে একটি টাইপ বরাদ্দ করা হয়েছে whatever। আপনি যখন করেন auto x = initializer;, একই ধরণের ছাড়টি প্রারম্ভিক করতে ব্যবহৃত xধরণের থেকে প্রকারটি নির্ধারণ করতে initializerব্যবহৃত হয়।

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

যখন এই উত্তরটি মূলত লেখা হয়েছিল (২০১১ সালে, সি ++ ১১ স্ট্যান্ডার্ডে কালি শুকানোর আগে) autoইতিমধ্যে যথেষ্ট পোর্টেবল ছিল। আজকাল, এটি সমস্ত মূলধারার সংকলকগুলির মধ্যে পুরোপুরি পোর্টেবল। এটি এড়ানোর একমাত্র সুস্পষ্ট কারণ হ'ল যদি আপনার কোনও সি সংকলকের সাথে সামঞ্জস্যপূর্ণ কোড লেখার প্রয়োজন হয় বা আপনার কিছু নির্দিষ্ট সংকলককে টার্গেট করার প্রয়োজন রয়েছে যা আপনি জানেন যে এটি সমর্থন করে না (উদাহরণস্বরূপ, কিছু লোক এখনও কোড লিখছেন) এমএস-ডস-এর জন্য বোরল্যান্ড, ওয়াটকম ইত্যাদির সংকলকগুলি ব্যবহার করে, যা দশকগুলিতে উল্লেখযোগ্য আপগ্রেড হয়নি। আপনি যদি মূলধারার যে কোনও সংকলকের যুক্তিসঙ্গতভাবে বর্তমান সংস্করণটি ব্যবহার করছেন তবে তা এড়িয়ে যাওয়ার কোনও কারণ নেই।


23

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


উহু! আহা, ভাষাটিকে কখনও সি -++ হিসাবে ভাবেনি এমন একটি জিনিস হিসাবে যা নিজের মধ্যে পরিবর্তন হতে পারে। তারা এই সি ++ 11 এ আর কী যুক্ত করেছে তা খতিয়ে দেখতে হবে, আমি কিছুটা সি ++ 0x শুনেছি তবে এর মধ্যে খুব বেশি গভীর খনন করা হয়নি।
অ্যান কুইন

7
@ ক্লেয়ারভায়ার সি ++ 0x এর অন্তর্বর্তী নাম ছিল। এটি এই মাসে প্রকাশিত হয়েছে, এবং এটি সি ++ 11 এ পরিণত হয়েছে।
আর মার্টিনহো ফার্নান্দেস

13

ভেরিয়েবলের জন্য, নির্দিষ্ট করে যে ভেরিয়েবলের ধরণটি ঘোষণা করা হচ্ছে তা এর আরম্ভকারী থেকে স্বয়ংক্রিয়ভাবে বাদ দেওয়া হবে। ফাংশনগুলির জন্য, উল্লেখ করে যে রিটার্নের ধরণটি একটি পিছনের রিটার্নের ধরণ বা তার রিটার্নের স্টেটমেন্ট (সি ++ 14 থেকে) থেকে কেটে নেওয়া হবে।

বাক্য গঠন

auto variable initializer   (1) (since C++11)

auto function -> return type    (2) (since C++11)

auto function   (3) (since C++14)

decltype(auto) variable initializer (4) (since C++14)

decltype(auto) function (5) (since C++14)

auto :: (6) (concepts TS)

cv(optional) auto ref(optional) parameter   (7) (since C++14)

ব্যাখ্যা

1) ব্লক স্কোপে, নেমস্পেসের সুযোগে, লুপের প্রারম্ভিককরণের বিবৃতিতে, ইত্যাদির ক্ষেত্রে ভেরিয়েবলগুলি ঘোষণার সময়, কীওয়ার্ড অটো টাইপ স্পেসিফায়ার হিসাবে ব্যবহৃত হতে পারে। একবার প্রারম্ভিকের ধরণ নির্ধারণ করা হয়ে গেলে, সংকলক প্রকার কল থেকে টেমপ্লেট আর্গুমেন্ট ছাড়ের নিয়ম ব্যবহার করে কীওয়ার্ড অটো প্রতিস্থাপন করবে এমন প্রকারটি নির্ধারণ করে (বিশদ বিবরণের জন্য টেমপ্লেট আর্গুমেন্ট কর্তন # অন্যান্য বিষয় দেখুন)। মূলশব্দ অটোতে সংশোধক বা & র মতো সংশোধকগুলিও থাকতে পারে যা টাইপ ছাড়ের ক্ষেত্রে অংশ নেবে। উদাহরণস্বরূপ, প্রদত্ত const auto& i = expr;, i টাইপটি হ'ল যুক্তিটির ধরণটি হ'ল এক কাল্পনিক টেমপ্লেটে template<class U> void f(const U& u)যদি ফাংশন কল হয়f(expr)সংকলিত ছিল অতএব, অটো এবং অ্যান্ডশিয়ালটি লুভের জন্য পরিসীমা ভিত্তিক ব্যবহৃত হয়, প্রারম্ভকালীন অনুসারে লভালিউ রেফারেন্স বা মূল মূল্য হিসাবে উল্লেখ করা যেতে পারে। যদি একাধিক ভেরিয়েবল ঘোষণার জন্য অটো ব্যবহার করা হয় তবে ছাড়ের ধরণগুলি অবশ্যই মেলাতে পারে। উদাহরণস্বরূপ, ঘোষণাটি auto i = 0, d = 0.0;দুর্গঠিত, যখন ঘোষণাপত্রটি auto i = 0, *p = &i;সুগঠিত হয় এবং স্বয়ংক্রিয়িকে ইনট হিসাবে বিয়োগ করা হয়।

২) একটি ফাংশন ঘোষণায় যা ট্রেলিং রিটার্ন টাইপ সিনট্যাক্স ব্যবহার করে, কীওয়ার্ড অটো স্বয়ংক্রিয় টাইপ সনাক্তকরণ সম্পাদন করে না। এটি কেবল সিনট্যাক্সের অংশ হিসাবে কাজ করে।

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

৪) যদি ভেরিয়েবলের ঘোষিত প্রকারটি ডিক্লাইপ (অটো) হয় তবে কীওয়ার্ড অটোটি তার আরম্ভকারীটির এক্সপ্রেশন (বা এক্সপ্রেশন তালিকা) দিয়ে প্রতিস্থাপিত হবে এবং ডিক্লাইপ জন্য নিয়ম ব্যবহার করে প্রকৃত প্রকারটি বাদ দেওয়া হবে।

5) যদি ফাংশনটির রিটার্ন ধরণের ডিক্লাইপ (অটো) হিসাবে ঘোষিত হয়, কীওয়ার্ড অটো তার রিটার্ন স্টেটমেন্টের অপারেন্ডের সাথে প্রতিস্থাপিত হবে এবং ডিক্লাইপ জন্য নিয়ম ব্যবহার করে আসল রিটার্ন টাইপ অনুমিত হয়।

)) ফর্ম অটো :: এর নেস্টেড-নাম-স্পেসিফায়ার হল এমন একটি স্থানধারক যা প্রতিবন্ধী স্থানধারক ছাড়ের নিয়ম অনুসরণ করে শ্রেণি বা গণনা টাইপের দ্বারা প্রতিস্থাপিত হয়।

7) ল্যাম্বডা এক্সপ্রেশনটিতে একটি প্যারামিটার ঘোষণা। (যেহেতু সি ++ 14) একটি ফাংশন প্যারামিটার ঘোষণা। (ধারণা টিএস)

নোট সি ++ 11 অবধি অটোতে স্টোরেজ সময়কালের নির্দিষ্টকরণকারকের অর্থ রয়েছে। এক ঘোষণায় স্বয়ংক্রিয় ভেরিয়েবল এবং ফাংশনগুলি মিশ্রিত করার auto f() -> int, i = 0;অনুমতি নেই।

আরও তথ্যের জন্য: http://en.cppreferences.com/w/cpp/language/auto


11

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


3

এটি কোথাও যাচ্ছে না ... এটি সি ++ 11 বাস্তবায়নে একটি নতুন স্ট্যান্ডার্ড সি ++ বৈশিষ্ট্য। এটি বলা হচ্ছে, যদিও এটি অবজেক্টের ঘোষণাগুলি সহজ করার পাশাপাশি নির্দিষ্ট কল-প্যারাডিজমগুলির জন্য সিনট্যাক্স পরিষ্কার করার জন্য দুর্দান্ত সরঞ্জাম (যেমন লুপগুলির জন্য রেঞ্জ-ভিত্তিক) এটি ব্যবহার করবেন না / অপব্যবহার করবেন না :-)


3

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

যখন আমাদের পুনরাবৃত্তি ব্যবহার করতে হবে এটি খুব কার্যকর হতে পারে। উদাহরণস্বরূপ নীচের কোডের জন্য আমরা পুরো আয়রোটর সিনট্যাক্স লেখার পরিবর্তে কেবল "অটো" ব্যবহার করতে পারি।

int main() 
{ 

// Initialize set 
set<int> s; 

s.insert(1); 
s.insert(4); 
s.insert(2); 
s.insert(5); 
s.insert(3); 

// iterator pointing to 
// position where 2 is 
auto pos = s.find(3); 

// prints the set elements 
cout << "The set elements after 3 are: "; 
for (auto it = pos; it != s.end(); it++) 
    cout << *it << " "; 

return 0; 
}

এভাবেই আমরা "অটো" কীওয়ার্ডটি ব্যবহার করতে পারি


0

এটি ম্যাজিক হ'ল নির্দিষ্ট ফাংশনে পাস হওয়া প্রতিটি ভেরিয়েবল টাইপের কোড লিখার ক্ষমতা হ্রাস করার ক্ষমতা এটি। এটি সি বেসে পাইথনের অনুরূপ মুদ্রণ () ফাংশনটি বিবেচনা করুন।

#include <iostream>
#include <string>
#include <array>

using namespace std;

void print(auto arg) {
     cout<<arg<<" ";
}

int main()
{
  string f = "String";//tok assigned
  int x = 998;
  double a = 4.785;
  string b = "C++ Auto !";
//In an opt-code ASCII token stream would be iterated from tok's as:
  print(a);
  print(b);
  print(x);
  print(f);
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.