কোন সি ++ ইডিয়মগুলি সি ++ 11 এ অবচয় করা হয়েছে?


192

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

কোডিংয়ের কোন পুরানো উপায়গুলি অবশ্যই সি ++ 11 শৈলীর চেয়ে নিকৃষ্টতর, এবং এর পরিবর্তে আমরা এখন কী করতে পারি?

এর উত্তরে, আপনি "অটো ভেরিয়েবলগুলি ব্যবহার করুন" এর মতো সুস্পষ্ট জিনিসগুলি এড়িয়ে যেতে পারেন।


13
তুমি পারবে না থামানো বাগধারার।
পাব্বি


5
ধ্রুবক মানগুলি ফিরিয়ে নেওয়া আর উত্সাহিত হয় না। স্পষ্টতই auto_ptrহ্রাস করা হয়।
Kerrek এসবির

27
অবশ্যই, পাব্বি। সি ++ টেমপ্লেট উদ্ভাবনের আগে টেমপ্লেটগুলি করার জন্য ম্যাক্রো কৌশল ছিল। তারপরে সি ++ এগুলিকে যুক্ত করেছে এবং পুরানো উপায়টিকে খারাপ বলে মনে করা হয়।
অ্যালান বালজেউ

7
এই প্রশ্নটি সত্যই প্রোগ্রামারস.স-এ স্থানান্তরিত হওয়া দরকার।
নিকোল বোলাস

উত্তর:


173
  1. চূড়ান্ত শ্রেণি : C ++ 11 finalক্লাসের বিকাশ রোধ করতে নির্দিষ্টকারী সরবরাহ করে
  2. সি ++ ১১ টি ল্যাম্বডাস নামযুক্ত ফাংশন অবজেক্ট (ফান্টেক্টর) শ্রেণির প্রয়োজনীয়তা যথেষ্ট পরিমাণে হ্রাস করে।
  3. মুভ কনস্ট্রাক্টর : std::auto_ptrমূল্যবোধের রেফারেন্সগুলির জন্য প্রথম শ্রেণীর সমর্থনের কারণে যে মায়াবী উপায়ে কাজ করে সেগুলি আর প্রয়োজন হয় না।
  4. নিরাপদ বুল : এটি আগে উল্লেখ করা হয়েছিল। সি ++ 11 এর সুস্পষ্ট অপারেটররা খুব সাধারণ সি ++ 03 আইডিয়োমকে মেনে চলে।
  5. সঙ্কুচিত থেকে ফিট : অনেকগুলি সি ++ 11 এসটিএল কনটেইনার একটি shrink_to_fit()সদস্য ফাংশন সরবরাহ করে, যা একটি অস্থায়ী সাথে অদলবদল প্রয়োজনকে মুছে ফেলা উচিত।
  6. অস্থায়ী বেস শ্রেণি : কিছু পুরানো সি ++ লাইব্রেরি এটি বরং জটিল প্রতিমা ব্যবহার করে। পদক্ষেপ শব্দার্থক সঙ্গে এটি আর প্রয়োজন হয় না।
  7. প্রকার নিরাপদ এনুমিউনেশনগুলি সি ++ 11 এ খুব নিরাপদ।
  8. হিপ বরাদ্দকে নিষিদ্ধ করছে : = deleteসিনট্যাক্সটি একটি নির্দিষ্ট কার্যকারিতা সুস্পষ্টভাবে অস্বীকার করা হয়েছে এমনটি বলার অনেক বেশি সরাসরি উপায়। এটি হ্যাপ বরাদ্দ (যেমন, =deleteসদস্যের জন্য operator new) প্রতিরোধ, অনুলিপি, অ্যাসাইনমেন্ট ইত্যাদি প্রতিরোধের ক্ষেত্রে প্রযোজ্য
  9. টেম্পলেটেড টাইপিডেফ : সি ++ 11 এ এলিয়াস টেম্পলেটগুলি সাধারণ টেম্প্লেড টাইপডাইফগুলির প্রয়োজনীয়তা হ্রাস করে। তবে জটিল ধরণের জেনারেটরের এখনও মেটা ফাংশন প্রয়োজন।
  10. কিছু সংখ্যার সংকলন-সময় গণনা, যেমন ফিবোনাচি সাধারণ ধ্রুবক এক্সপ্রেশন ব্যবহার করে সহজেই প্রতিস্থাপন করা যেতে পারে
  11. result_of: ক্লাস টেমপ্লেটের ব্যবহারগুলি result_ofপ্রতিস্থাপন করা উচিত decltype। আমি মনে করি এটি উপলব্ধ হলে result_ofব্যবহার করে decltypeuses
  12. শ্রেণিবদ্ধ সদস্য প্রারম্ভিকরা ডিফল্ট মান সহ স্থিতিশীল সদস্যদের ডিফল্ট প্রাথমিককরণের জন্য টাইপিং সংরক্ষণ করে।
  13. নতুন সি ++ এ কোডটি NULLনতুন হিসাবে সংজ্ঞায়িত করা উচিত nullptr, তবে তারা কেন এর বিপরীতে সিদ্ধান্ত নিয়েছে তা জানতে এসটিএলের আলাপ দেখুন ।
  14. এক্সপ্রেশন টেম্পলেট ধর্মান্ধরা সি ++ 11 এ ট্রিলিং রিটার্ন টাইপের ফাংশন সিনট্যাক্স পেয়ে আনন্দিত । আর 30-লাইনের দীর্ঘ রিটার্নের ধরণ নেই!

আমার মনে হয় আমি সেখানেই থামব!


বিস্তারিত স্টাফ জন্য ধন্যবাদ!
অ্যালান বালজেউ

7
দুর্দান্ত উত্তর, তবে আমি result_ofতালিকা থেকে ধর্মঘট করব । কষ্টকর সত্ত্বেও typenameএটা আগে ছিল, আমি মনে করি typename result_of<F(Args...)::typeমাঝে মাঝে চেয়ে পড়ার জন্য সহজ হতে পারে decltype(std::declval<F>()(std::declval<Args>()...), এবং স্বীকৃতি সঙ্গে N3436 কাজ কাগজের মধ্যে তারা SFINAE জন্য উভয় কাজ (যা একটি সুবিধা ব্যবহার করা হয় decltypeযে result_ofপ্রস্তাব না)
জোনাথন Wakely

14 সম্পর্কে) আমি এখনও কাঁদছি যে একই কোডটি দুটি বার লিখতে আমাকে ম্যাক্রোগুলি ব্যবহার করতে হবে - একবার ফাংশন বডি এবং একবার ডেসালটাইপ () বিবৃতিতে ...

2
আমি লক্ষ করতে চাই যে এই বিষয়টিকে এই মাইক্রোসফ্ট পৃষ্ঠা থেকে সি ++ ভাষার একটি সাধারণ পরিচিতির "আরও তথ্যের জন্য" নিবন্ধ হিসাবে যুক্ত করা হয়েছে, তবে এই বিষয়টি একটি অত্যন্ত বিশেষায়িত একটি! আমি প্রস্তাব দিতে পারি যে একটি সংক্ষিপ্ত "এই বিষয়টি সি ++ নবাগতদের নয়!" পরামর্শ বা এই উত্তরটির শুরুতে অন্তর্ভুক্ত করা উচিত?
আছিনি

পুনরায় 12: "ইন-ক্লাসে সদস্য ইনিশিয়ালাইজেশন" - এটিই নতুন আইডিয়ম, অবহেলিত প্রতিমা নয়, তাই না? সাজা আদেশ সম্ভবত পরিবর্তন? পুনরায় 2: আপনি যখন বস্তুর পরিবর্তে বিভিন্ন ধরণের (বিশেষত টেম্পলেট প্যারামিটারগুলিতে) পাস করতে চান তখন ফ্যান্টেক্টরগুলি খুব দরকারী। সুতরাং এটি কেবল কিছু ব্যবহারকারীর ব্যবহার হ'ল যা হ্রাস করা হয়েছে।
einpoklum

66

এক সময় এমন যুক্তি দেওয়া হয়েছিল যে constকেবলমাত্র মান দ্বারা পরিবর্তে মান দ্বারা ফিরে আসা উচিত :

const A foo();
^^^^^

এটি বেশিরভাগ সি ++ 98/03 এ নির্দোষ ছিল এবং এমন কি কয়েকটি বাগও দেখতে পেল যা দেখতে পেল:

foo() = a;

তবে এর মাধ্যমে ফিরে আসা constসি ++ 11 এ বিপরীত কারণ এটি চলাচলের শব্দার্থতাকে বাধা দেয়:

A a = foo();  // foo will copy into a instead of move into it

সুতরাং শুধু শিথিল এবং কোড:

A foo();  // return by non-const value

9
প্রতিরোধযোগ্য ভুলগুলি এখন ফাংশনগুলির জন্য রেফারেন্স কোয়ালিফায়ার ব্যবহার করে ধরা যেতে পারে। যেমন উপরের ক্ষেত্রে A& operator=(A o)&পরিবর্তে সংজ্ঞায়িত A& operator=(A o)। এগুলি নিরীহ ভুলগুলি প্রতিরোধ করে এবং ক্লাসগুলি আরও মৌলিক ধরণের মতো আচরণ করে এবং চলাচল শব্দার্থবিধি প্রতিরোধ করে না।
জো

61

যত তাড়াতাড়ি আপনি ত্যাগ করতে 0এবং NULLপক্ষে যেতে পারেন nullptr, তাই করুন!

অ জেনেরিক কোডে ব্যবহার 0বা NULLএত বড় চুক্তি হয় না। আপনি জেনেরিক কোডে নাল পয়েন্টার ধ্রুবকগুলির কাছাকাছি যেতে শুরু করার সাথে সাথে পরিস্থিতিটি দ্রুত পরিবর্তিত হয়। যখন আপনি 0কোনও পাস করেন তখন নাল পয়েন্টার ধ্রুবক হিসাবে না এবং template<class T> func(T) Tহিসাবে কেটে নেওয়া হয় int। এবং এটির পরে কোনও নাল পয়েন্টার ধ্রুবকটিতে রূপান্তর করা যাবে না। এই কাসকেডগুলি এমন এক সমস্যার সৃষ্টি করে যা মহাবিশ্ব কেবল যদি ব্যবহৃত হয় তবে কেবল অস্তিত্বই নেই nullptr

সি ++ 11 অবনতি হয় না 0এবং NULLনাল পয়েন্টার ধ্রুবক হিসাবে। তবে আপনার কোড করা উচিত did


ডিক্লিটাইপ (নাল্পটার) কী?

4
@ গ্র্যাপসকনুটস: এটি std::nullptr_t
হাওয়ার্ড হিন্যান্ট

এটিকে নতুন করে কনভেনশন গ্রহণ করার পরিবর্তে আইডিয়োম অবমূল্যায়ন করা হিসাবে পুনর্বিবেচনা করার পরামর্শ দিন (যেমন " নাল পয়েন্টার ব্যবহার 0বা এর NULLজন্য")।
einpoklum

38

নিরাপদ বুল আইডিয়ামexplicit operator bool()

বেসরকারী অনুলিপি নির্মাণকারী (উত্সাহ: ননকপি) → X(const X&) = delete

ব্যক্তিগত বিনাশকারী এবং ভার্চুয়াল উত্তরাধিকার সঙ্গে চূড়ান্ত বর্গ Simulatingclass X final


ভাল এবং সংক্ষিপ্ত উদাহরণ, যার মধ্যে একটি এমনকি এর মধ্যে "আইডিয়াম" শব্দটি বহন করে। ভাল করে বলা
সেবাস্তিয়ান মাচ

2
বাহ, আমি এর আগে 'সেফ বুল আইডিয়াম' দেখিনি, এটি বেশ জঘন্য মনে হচ্ছে! আমি আশা করি প্রি-সি ++ 11 কোডে আমার আর কখনও এটির প্রয়োজন হবে না ...
বালক

24

যে বিষয়গুলি কেবল আপনাকে সি ++ 11 এ বেসিক অ্যালগরিদমগুলি এড়াতে এড়াতে বাধ্য করে তা হ'ল স্ট্যান্ডার্ড লাইব্রেরি দ্বারা সরবরাহিত অ্যালগরিদমের সাথে মিলিয়ে ল্যাম্বডাসের উপলব্ধতা।

আমি এখন এটি ব্যবহার করছি এবং এটি অবিশ্বাস্য যে আপনি প্রায়শই ঘন ঘন লুপগুলি লেখার পরিবর্তে count_if (), for_each () বা অন্যান্য অ্যালগরিদম ব্যবহার করে আপনি কী করতে চান তা জানান।

আপনি একবার সম্পূর্ণ সি ++ 11 স্ট্যান্ডার্ড লাইব্রেরির সাথে সি ++ 11 সংকলক ব্যবহার করলে, আপনার নিজের তৈরির জন্য স্ট্যান্ডার্ড অ্যালগরিদম ব্যবহার না করার জন্য আপনার আর কোনও ভাল বাহানা নেই । লাম্বদা ঠিক এটা মেরে ফেল।

কেন?

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

মূলত, স্ট্যান্ডার্ড আলগোরিদিমগুলি দিয়ে তৈরি অ্যালগরিদমগুলি পড়া শব্দগুলি লুপগুলির প্রয়োগের বিশদটি গোপন করার কারণে অনেক সহজ।

আমি অনুমান করছি যে কেবলমাত্র উচ্চতর স্তরের অ্যালগরিদমগুলি এখনই ভাবা উচিত যে আমাদের আরও নিম্ন স্তরের অ্যালগরিদম তৈরি করতে হবে।


8
আসলে একটি ভাল অজুহাত আছে। আপনি বুস্ট.রেঞ্জের অ্যালগোরিদম ব্যবহার করছেন , যা অনেক সুন্দর;)
নিকল বোলাস

10
আমি দেখতে পাচ্ছি না যে for_eachল্যাম্বের সাথে লুপের জন্য ল্যাম্বদার সামগ্রীগুলি সমেত লুপের সমতুল্য পরিসীমা-ভিত্তিক চেয়ে আরও ভাল। কোডটি কম বেশি একই দেখায় তবে ল্যাম্বদা কিছু অতিরিক্ত বিরামচিহ্নের প্রবর্তন করে। আপনি boost::irangeস্পষ্টতই পুনরাবৃত্তিকারীদের ব্যবহার না করে তার চেয়ে বেশি লুপগুলিতে প্রয়োগ করতে চাইলে সমান জিনিস ব্যবহার করতে পারেন । এছাড়াও লুপের জন্য পরিসীমা-ভিত্তিক আরও নমনীয়তা থাকে, আপনি প্রয়োজনে (আগে returnবা দ্বারা break) প্রথমে প্রস্থান করতে পারেন , যেখানে for_eachআপনাকে নিক্ষেপ করতে হবে।
স্টিভ জেসোপ

5
@SteveJessop: এমনকি, তাই পরিসর ভিত্তিক প্রাপ্যতা forতোলে স্বাভাবিক it = c.begin(), const end = c.end(); it != end; ++itবাগ্ধারা বিলুপ্ত।
বেন ভয়েগট

7
@ স্টিভ জেসাপ for_eachলুপের জন্য ভিত্তিক পরিসীমাটির তুলনায় অ্যালগরিদমের একটি সুবিধা হ'ল আপনি পারবেন না break বা করতে পারবেন নাreturn । এটি হ'ল আপনি যখন দেখবেন for_eachতাত্ক্ষণিকভাবে দেহের দিকে নজর না দিয়ে জানবেন যে এরকম কোনও চালাকি নেই।
bames53

5
@ ক্লেইম: নির্দিষ্ট করে বলতে গেলে আমি উদাহরণের std::for_each(v.begin(), v.end(), [](int &i) { ++i; });সাথে তুলনা করছি for (auto &i : v) { ++i; }। আমি স্বীকার করি যে নমনীয়তা দ্বি-প্রান্তযুক্ত ( gotoখুব নমনীয়, এটাই সমস্যা)। আমি মনে করি না যে ব্যবহার করতে পারবেন না হওয়ার বাধ্যতা breakমধ্যে for_eachঅতিরিক্ত ভারবোসিটি এটা দাবী জন্য সংস্করণ ক্ষতিপূরণ - ব্যবহারকারীদের for_eachএখানে আইএমও তাত্ত্বিক ধারণা এক ধরনের যে জন্য প্রকৃত পাঠযোগ্যতা এবং সুবিধা sacrificing হয় for_eachহয় নীতিগতভাবে পরিষ্কার এবং ধারণার দিক থেকে সহজ। অনুশীলনে এটি পরিষ্কার বা সহজ নয়।
স্টিভ জেসপ

10

আপনার swapকম সময়ে কাস্টম সংস্করণ প্রয়োগ করতে হবে । সি ++ 03-এ, swapব্যয়বহুল এবং নকল নকল এড়ানোর জন্য একটি দক্ষ অ-নিক্ষেপ করা প্রায়শই প্রয়োজন এবং যেহেতু std::swapদুটি অনুলিপি ব্যবহার করে, swapপ্রায়শই কাস্টমাইজ করতে হয়। সি ++ এর মধ্যে, std::swapব্যবহারগুলি move, এবং তাই দক্ষ এবং অ-নিক্ষেপিত মুভ কনস্ট্রাক্টর এবং মুভ অ্যাসাইনমেন্ট অপারেটরগুলি প্রয়োগের উপর ফোকাস বদল। যেহেতু এইগুলির জন্য ডিফল্ট প্রায়শই ঠিক থাকে তবে এটি সি ++ 03 এর চেয়ে অনেক কম কাজ হবে।

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


1
আমি এ বিষয়ে সন্দেহজনক। প্রস্তাবিত শৈলীটি সরানো এবং অনুলিপি নির্মাণের জন্য অদলবদল ব্যবহার করা হয় তবে স্টাডি :: অদলবদল নয় কারণ এটি বিজ্ঞপ্তিযুক্ত হবে।
অ্যালান বালজেউ

হ্যাঁ তবে মুভ কনস্ট্রাক্টর সাধারণত একটি কাস্টম অদলবালী কল করে বা এটি মূলত সমতুল্য।
বিপরীতে

2

আমি এর নামটি জানি না, তবে সি ++ 03 কোডটি প্রায়শই নিখরচায় স্থানান্তর অ্যাসাইনমেন্টের প্রতিস্থাপন হিসাবে নিম্নরূপ নির্মাণটি ব্যবহার করে:

std::map<Big, Bigger> createBigMap(); // returns by value

void example ()
{
  std::map<Big, Bigger> map;

  // ... some code using map

  createBigMap().swap(map);  // cheap swap
}

swapউপরের সাথে একত্রে অনুলিপি করার কারণে এটি কোনও অনুলিপি এড়ানো হয়নি ।


1
আপনার উদাহরণে অদলবদল অপ্রয়োজনীয়, অনুলিপি এলিজেন্স mapযাইহোক রিটার্ন মানটি তৈরি করবে । আপনি যে কৌশলটি দেখান সেটি কেবল নির্মিত mapনা হয়ে ইতিমধ্যে উপস্থিত থাকলে দরকারী । উদাহরণস্বরূপ "সস্তা ডিফল্ট কনস্ট্রাক্টর" মন্তব্য না করে এবং সেই নির্মাণ এবং অদলবদলের মধ্যে "// ..." দিয়ে ভাল হতে পারে
জোনাথন ওয়াকলি

আপনার পরামর্শ অনুযায়ী আমি এটি পরিবর্তন করেছি। ধন্যবাদ।
আন্ড্রেজ

"বড়" এবং "বড়" ব্যবহার বিভ্রান্তিকর। কী এবং মানের ধরণের বিষয়টি কীভাবে ব্যাখ্যা করবে না?
einpoklum

1

যখন আমি লক্ষ্য করেছি যে সি ++ 11 স্ট্যান্ডার্ড ব্যবহার করে একটি সংকলক আর নিম্নলিখিত কোডটিকে ত্রুটিযুক্ত না:

std::vector<std::vector<int>> a;

ধারণা করা হয় অপারেটরযুক্ত >> আমি নাচতে শুরু করি। আগের সংস্করণগুলিতে একটি করতে হবে

std::vector<std::vector<int> > a;

বিষয়টিকে আরও খারাপ করে তোলার জন্য, যদি আপনাকে কখনও এটির ডিবাগ করতে হয় তবে আপনি জানেন যে এ থেকে আসা ত্রুটি বার্তাগুলি কতটা ভয়াবহ।

আমি তবে জানি না যে এটি আপনার কাছে "সুস্পষ্ট" ছিল কিনা।


1
এই বৈশিষ্ট্যটি পূর্ববর্তী সি ++ এ ইতিমধ্যে যুক্ত করা হয়েছে। বা কমপক্ষে ভিজ্যুয়াল সি ++ বহু বছর আগে এটি স্ট্যান্ডার্ড আলোচনা অনুযায়ী প্রয়োগ করেছে।
অ্যালান বালজেউ

1
@ অ্যালান বালজেউ অবশ্যই অনেকগুলি মানক জিনিস সংকলক / গ্রন্থাগারে যুক্ত করা হচ্ছে। এমন অনেকগুলি সংকলক ছিল যা সি ++ 11 এর আগে "অটো" ভেরিয়েবল ঘোষণা ছিল, তবে তারপরে আপনি নিশ্চিত হতে পারবেন না যে আপনার কোডটি আসলে অন্য কোনও কিছুর দ্বারা সংকলিত হতে পারে। প্রশ্নটি স্ট্যান্ডার্ড সম্পর্কে ছিল, "এমন কোনও সংকলক ছিল যা এটি করতে পারে" সম্পর্কে নয়।
v010dya

1

মান দ্বারা ফিরে আসা এখন আর কোনও সমস্যা নয়। মুভ সিমানটিকস এবং / অথবা রিটার্ন মান অপ্টিমাইজেশন (সংকলক নির্ভর) কোডিং ফাংশনগুলি ওভারহেড বা ব্যয় (বেশিরভাগ সময়) ছাড়াই বেশি প্রাকৃতিক।


... তবে কোন আইডিয়োম অবমূল্যায়ন করা হয়েছে?
einpoklum

কোনও প্রতিমা নয় তবে এটি একটি ভাল অনুশীলন ছিল যা আর প্রয়োজন হয় না। এমনকি সংকলক সমর্থিত আরভিও যা alচ্ছিক। en.wikedia.org/wiki/Return_value_optimization "C ++ এর বিবর্তনের প্রাথমিক পর্যায়ে, কোনও ফাংশন থেকে শ্রেণীর ধরণের কোনও বিষয় দক্ষতার সাথে ফিরিয়ে দিতে ভাষার অক্ষমতাটিকে দুর্বলতা হিসাবে বিবেচনা করা হত ....." স্ট্রাক্ট ডেটা {চর বাইটস [ 16]; }; অকার্যকর চ (ডেটা * পি) {// সরাসরি * পি} ইন্ট মেইন () {ডেটা ডি ফলাফল উত্পন্ন; চ (& ঘ); }
মার্টিন এ

আমি আপনাকে ইঙ্গিত দিচ্ছিলাম যে আপনার উত্তরটি "মূল্য দিয়ে ফেরত এড়ানো প্রথা ইত্যাদির মতো প্রাসঙ্গিক নয় etc. ইত্যাদি as"
einpoklum
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.