C ++ 11 এ "রিটার্ন {}" বিবৃতিটির অর্থ কী?


115

কি বক্তব্য

return {};

সি ++ এ ইঙ্গিত করে এবং কখন এটি ব্যবহার করতে হয় (বলুন) এর পরিবর্তে

return NULL;

অথবা

return nullptr;

59
এটি ফাংশনটির রিটার্ন টাইপের একটি ডিফল্ট-নির্মান উদাহরণ দেয়।
রিচার্ড

নাকি return;মূল্য ছাড়াই সহজ ?
i486

না, আলোচনার ফলে, এটি একটি সংকলন-সময় ত্রুটি যদি আপনার ফাংশনটি কোনও কিছু ফেরত দেয় (যেমন শূন্য রিটার্নের ধরণের নয়) এবং আপনি কেবল লিখেন return; অন্যদিকে আপনার return{};যদি রিটার্নের ধরণ থাকে তবে বৈধ is
পিডিয়া

@ পিডিএ সর্বদা নয়, কিছু অবজেক্টের জন্য যুক্তিগুলির প্রয়োজন হবে
এমএম

উত্তর:


108

return {};"ফাংশনটির রিটার্ন টাইপের একটি অবজেক্ট খালি তালিকা-আরম্ভকারী দিয়ে সূচনা করে " নির্দেশ করে। সঠিক আচরণটি প্রত্যাবর্তিত অবজেক্টের ধরণের উপর নির্ভর করে।

Cppreferences.com থেকে (কারণ ওপিকে সি ++ 11 ট্যাগ করা হয়েছে, আমি সি ++ 14 এবং সি ++ 17 এ নিয়মগুলি বাদ দিয়েছি; আরও তথ্যের জন্য লিঙ্কটি দেখুন):

  • যদি ব্রেসড-ডিআইএন-তালিকাটি খালি থাকে এবং টি ডিফল্ট কনস্ট্রাক্টর সহ শ্রেণীর ধরণের হয় তবে মান-আরম্ভকরণ সম্পাদিত হয়।
  • অন্যথায়, যদি টি একটি সামগ্রিক প্রকার হয়, সমষ্টিগত সূচনা হয়।
  • অন্যথায়, যদি টি স্টাড :: আরম্ভকারী_লিস্টের বিশেষীকরণ হয় তবে টি অবজেক্টটি ব্রেসড-আরআইএন-তালিকা থেকে প্রসঙ্গের উপর নির্ভর করে সরাসরি-সূচনা বা অনুলিপি-আরম্ভ হয়।
  • অন্যথায়, টি এর নির্মাতারা দুটি পর্যায়ে বিবেচনা করা হয়:

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

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

সি ++ 11 এর আগে একটি ফাংশন ফেরার জন্য std::string, আপনি লিখেছেন:

std::string get_string() {
    return std::string();
}

সি ++ 11 এ ব্রেস সিনট্যাক্স ব্যবহার করে, আপনাকে টাইপটি পুনরাবৃত্তি করতে হবে না:

std::string get_string() {
    return {}; // an empty string is returned
}

return NULLএবং return nullptrযখন ফাংশনটি একটি পয়েন্টার প্রকারটি দেয় তখন ব্যবহার করা উচিত:

any_type* get_pointer() {
    return nullptr;
}

তবে, NULLসি ++ 11 সাল থেকে অবচিত হ'ল কারণ এটি একটি পূর্ণসংখ্যার মান (0) এর কেবলমাত্র একটি উপনাম, যখন nullptrএটি একটি আসল পয়েন্টার প্রকার:

int get_int() {
    return NULL; // will compile, NULL is an integer
}

int get_int() {
    return nullptr; // error: nullptr is not an integer
}

91

এটি সম্ভবত বিভ্রান্তিকর:

int foo()
{
  return {};   // honestly, just return 0 - it's clearer
}

এটি সম্ভবত না:

SomeObjectWithADefaultConstructor foo()
{
  return {};
  // equivalent to return SomeObjectWithADefaultConstructor {};
}

9
সুতরাং, এটি একটি সংকলন-সময় ত্রুটি যদি রিটার্ন টাইপের ডিফল্ট কনস্ট্রাক্টর না থাকে, সঠিক?
পিডিয়া

10
এটি একটি সংকলন ত্রুটি যদি রিটার্নের ধরণটি এমন কোনও শ্রেণি হয় যেখানে স্পষ্টত অ- নির্ধারিত ডিফল্ট নির্মাণকারী থাকে না এবং সমষ্টি না হয়।
Oktalist

3
যদি টাইপটির কোনও initializer_listকনস্ট্রাক্টর থাকে তবে ডিফল্ট কনস্ট্রাক্টর উপলব্ধ না থাকলে তা ব্যবহৃত হবে না?
celtschk

4
"সম্ভবত বিভ্রান্তি"? এ কারণেই কি কোনও নামহীন আত্মাকে "সেই স্ফীত অশ্লীলতা যা সি ++" বলে উল্লেখ করা হয়? কী-স্ট্রোকগুলিতে যা কিছু সঞ্চয় করা যায় তা এটি প্রদত্ত স্পষ্টতার অভাবের জন্য সম্ভাব্যতাকে ন্যায্যতা দিতে পারে? এটি একটি আন্তরিক প্রশ্ন। ব্যবহারিক উদাহরণ দিয়ে আমাকে বোঝান।
মিকিফএগেইন_পূর্বেএক্সিটঅফএসও

4
return {}সমতুল্য নয়return SomeObjectWithADefaultConstructor{};
এমএম

26

return {};এর অর্থ {}হল প্রত্যাবর্তনের মূল্যের জন্য আরম্ভকারী । প্রত্যাবর্তনের মানটি খালি তালিকার সাথে তালিকাভুক্ত করা হয়।


C ++ স্ট্যান্ডার্ডের [stmt.return] এর উপর ভিত্তি করে রিটার্ন মানটির কিছু পটভূমি এখানে রয়েছে :

কোনও ফাংশনের জন্য যা মান অনুসারে প্রত্যাবর্তন করে (যেমন রিটার্নের ধরণটি কোনও রেফারেন্স নয় এবং না void) এর জন্য একটি অস্থায়ী অবজেক্ট রয়েছে রিটার্ন মান । এই অবজেক্টটি returnবিবৃতি দ্বারা তৈরি করা হয়েছে এবং এর সূচনাদাতারা রিটার্নের বিবৃতিতে যা ছিল তার উপর নির্ভর করে।

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

ফেরতের মান দুটি ভিন্ন উপায়ে শুরু করা যেতে পারে:

  • return some_expression;- রিটার্ন মান থেকে অনুলিপি করা হয়some_expression
  • return { possibly_empty_list };- রিটার্ন মান তালিকা থেকে তালিকাভুক্ত করা হয়।

ধরে Tনেওয়া ফাংশনটির রিটার্নের ধরণ, তারপরে নোট করুন যা এর return T{};থেকে পৃথক return {}: পূর্বে একটি অস্থায়ী T{}তৈরি হয় এবং তারপরে রিটার্ন মানটি সেই অস্থায়ী থেকে অনুলিপি করা হয়।

Tঅ্যাক্সেসযোগ্য অনুলিপি / মুভ-কনস্ট্রাক্টর না থাকলে এটি সংকলন করতে ব্যর্থ হবে , তবে return {};const নির্মাতারা উপস্থিত না থাকলেও সফল হবে। তদনুসারে, return T{};অনুলিপি-নির্মাণকারী এর পার্শ্ব-প্রতিক্রিয়াগুলি দেখাতে পারে, যদিও এটি একটি অনুলিপি প্রসঙ্গ তাই এটি নাও পারে।


সি ++ ১৪ (এন 4140 [dcl.init.list] / 3) এ তালিকা- সূচনাকরণের একটি সংক্ষিপ্ত পুনরুদ্ধার এখানে দেওয়া হয়েছে, যেখানে আরম্ভকারী খালি তালিকা রয়েছে:

  • যদি Tএকটি সমষ্টি হয়, তবে প্রতিটি সদস্যের তার ব্রেস-বা সম-ইনিশিয়ালাইজার থেকে শুরু করে যদি এটির একটি থাকে, অন্যথায় যদি হয় {} (সুতরাং এই পদক্ষেপগুলি পুনরাবৃত্তভাবে প্রয়োগ করুন)।
  • যদি T কোনও ব্যবহারকারী-সরবরাহিত ডিফল্ট কনস্ট্রাক্টর সহ শ্রেণীর ধরণ থাকে তবে সেই কনস্ট্রাক্টরকে ডাকা হয়।
  • যদি Tএকটি স্পষ্টভাবে সংজ্ঞায়িত, বা = defaultএড ডিফল্ট কনস্ট্রাক্টর সহ শ্রেণীর ধরণ হয় তবে অবজেক্টটি শূন্য-ইনিশিয়ালাইজড এবং তারপরে ডিফল্ট কনস্ট্রাক্টর বলা হয়।
  • যদি T হয় কstd::initializer_list , প্রত্যাবর্তনের মানটি খালি এই জাতীয় তালিকা।
  • অন্যথায় (অর্থাত্ Tএকটি শ্রেণিবদ্ধ প্রকার - রিটার্নের ধরণগুলি অ্যারে হতে পারে না), ফেরতের মান শূন্য-আরম্ভ হয়।

সমষ্টিগত সূচনাটি প্রথমে আসে এবং এটি প্রতিটি সদস্যকে পুনরাবৃত্তির সাথে আরম্ভ করে {}, যা মান-ইআর হতে পারে বা নাও হতে পারে।
টিসি

@ টিটিসি ঠিক আছে, আমি সিপ্রেফারেন্স দিয়ে গিয়েছিলাম তবে একটি "সি +++ অবধি" উপেক্ষা করেছি
এমএম

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