কেন আমাদের প্রয়োজনের প্রয়োজন হয়?


161

সি ++ 20 ধারণাগুলির একটি কোণ হ'ল এমন কিছু পরিস্থিতিতে রয়েছে যা আপনাকে লিখতে হবে requires requires। উদাহরণস্বরূপ, [expr.prim.req] / 3 এর থেকে এই উদাহরণ :

একটি আবশ্যক-এক্সপ্রেশনটি কোনও প্রয়োজনীয়-ধারা ([টেম্প]) এ টেমপ্লেট আর্গুমেন্টগুলিতে যেমন নীচের মত একটি অ্যাড-হক বাধা লেখার উপায় হিসাবেও ব্যবহার করা যেতে পারে :

template<typename T>
  requires requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

প্রথমটির জন্য প্রয়োজনীয়-ধারাটি পরিচয় করানো হয় এবং দ্বিতীয়টি প্রয়োজনীয়তা-প্রকাশের পরিচয় দেয় ।

দ্বিতীয় requiresকীওয়ার্ডটির প্রয়োজনের পিছনে প্রযুক্তিগত কারণ কী ? কেন আমরা কেবল লেখার অনুমতি দিতে পারি না:

template<typename T>
  requires (T x) { x + x; }
    T add(T a, T b) { return a + b; }

(দ্রষ্টব্য: দয়া করে এর ব্যাকরণটির উত্তর দিবেন requiresনা)


25
পরামর্শ: "এমন কি এমন কিছু কি প্রয়োজন যা প্রয়োজন হয়?" আরও গুরুতরভাবে, আমার একটা কুঁচকির পিছনে একই কারণ রয়েছে noexcept(noexcept(...))
কোয়ান্টিন

11
দু'টি requiresআমার মতে একই শব্দ: এটি দেখতে একই রকম, একই রকম বানান, একই গন্ধ, তবে স্বতন্ত্রভাবে পৃথক। যদি আমি কোনও সমাধানের পরামর্শ দিই, তবে আমি তাদের একটির নাম পরিবর্তন করার পরামর্শ দেব।
ওয়াইএসসি

5
@ ওয়াইএসসি - co_requires? (দুঃখিত, প্রতিহত করতে পারেনি)।
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

122
পাগলামি কোথায় থামবে? আপনি জানেন পরবর্তী জিনিস, আমাদের হবে long long
এলজয়

8
@ স্টিরিটেলার: "প্রয়োজনীয় কি প্রয়োজন?" আরও বেশি সরকারী হতে পারে !!
পিডব্লিউ

উত্তর:


81

ব্যাকরণ এর প্রয়োজন কারণ এটি। এটা করে.

একটি requiresসীমাবদ্ধতার জন্য একটি এক্সপ্রেশন ব্যবহার করতে হবে না requires। এটি যেকোনও কম বা কম নির্বিচারে বুলিয়ান ধ্রুবক অভিব্যক্তি ব্যবহার করতে পারে। অতএব, requires (foo)অবশ্যই একটি বৈধ requiresবাধা হওয়া উচিত ।

একটি requires অভিব্যক্তি (যে জিনিস যা নির্দিষ্ট কিছু জিনিস নির্দিষ্ট বাধা অনুসরণ করে কিনা তা পরীক্ষা করে) একটি স্বতন্ত্র গঠন; এটি ঠিক একই কীওয়ার্ড দ্বারা প্রবর্তিত। requires (foo f)একটি বৈধ requiresএক্সপ্রেশন শুরু হবে ।

আপনি যা চান তা হ'ল আপনি requiresযদি এমন জায়গা ব্যবহার করেন যা সীমাবদ্ধতাগুলি স্বীকার করে, আপনি এই requiresধারাটির বাইরে "সীমাবদ্ধতা + প্রকাশ" করতে সক্ষম হবেন ।

তাই এখানে প্রশ্ন: আপনি করা requires (foo)একটি স্থান, যা উপযুক্ত একটি বাধ্যতা প্রয়োজন জন্য ... কতদূর পার্সার আগে এটা বুঝতে পারেন যে এই হল যেতে আছে মধ্যে একটি প্রয়োজন বাধ্যতা আপনি যেভাবে চান সেভাবে একটি বাধ্যতা + + অভিব্যক্তি বদলে হতে হবে?

এই বিবেচনা:

void bar() requires (foo)
{
  //stuff
}

যদি fooএটি কোনও প্রকার হয়, তবে (foo)তার একটি প্যারামিটারের তালিকাটি হ'ল প্রকাশের প্রয়োজন হয় এবং এর সমস্ত কিছুই {}ফাংশনের মূল অংশ নয় তবে সেই requiresঅভিব্যক্তির মূল অংশ। অন্যথায়, fooএকটি requiresঅনুচ্ছেদে একটি অভিব্যক্তি ।

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

হ্যাঁ, এটি ব্যাকরণ।


2
কোনও নাম ছাড়াও কোনও পরামিতি তালিকা থাকা কি বোধগম্য?
নাথান অলিভার

3
@ কুইন্টিন: সি ++ ব্যাকরণে অবশ্যই প্রসঙ্গ-নির্ভরতার ঘটনা রয়েছে। তবে কমিটি সত্যই এটি হ্রাস করার চেষ্টা করে এবং তারা অবশ্যই আরও যুক্ত করতে পছন্দ করে না ।
নিকল বোলাস

3
@RobertAndrzejuk: যদি requiresএকটি পরে প্রদর্শিত হবে <>টেমপ্লেট আর্গুমেন্ট সেট বা ফাংশন প্যারামিটার তালিকার পরে, তারপর এটি একটি প্রয়োজন-দফা। যদি requiresকোনও অভিব্যক্তিটি বৈধ যেখানে উপস্থিত হয়, তবে এটি একটি প্রয়োজন-এক্সপ্রেশন। এটি পার্স গাছের কাঠামোর দ্বারা নির্ধারণ করা যেতে পারে, পার্স গাছের বিষয়বস্তু নয় (কোনও সনাক্তকারী কীভাবে সংজ্ঞায়িত হয় তার নির্দিষ্টকরণ গাছের বিষয়বস্তু হতে পারে)।
নিকল বোলাস

6
@ রবার্টএন্ড্রজেজুক: অবশ্যই, প্রয়োজনীয়তা-অভিব্যক্তিটি একটি আলাদা কীওয়ার্ড ব্যবহার করতে পারত। তবে কী-ওয়ার্ডের সি ++ তে প্রচুর ব্যয় হয়, কারণ তাদের কীওয়ার্ড হয়ে গেছে এমন শনাক্তকারী ব্যবহার করে এমন কোনও প্রোগ্রাম ভাঙার সম্ভাবনা রয়েছে। ধারণাগুলির প্রস্তাব ইতিমধ্যে দুটি কীওয়ার্ড চালু করেছে: conceptএবং requires। তৃতীয়টির সাথে পরিচয় করিয়ে দেওয়া, যখন দ্বিতীয়টি ব্যাকরণগত সমস্যা এবং কয়েকটি ব্যবহারকারীর মুখোমুখি সমস্যা না থাকলে উভয় ক্ষেত্রেই কভার করতে সক্ষম হবে just সর্বোপরি, একমাত্র ভিজ্যুয়াল সমস্যাটি হ'ল মূল শব্দটি দু'বার পুনরাবৃত্তি হতে থাকে।
নিকল বোলাস

3
পছন্দ করেছেন সুতরাং এই জাতীয় স্বল্প ব্যবহারের প্রস্তাবিত বৈশিষ্ট্যটির জন্য সনাক্তকারী নেওয়া ভাল ধারণা নয়।
Rakete1111

60

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

সি ++ 11 এর " noexcept-ক্লেজ" এবং " noexceptএক্সপ্রেসনস " রয়েছে। তারা বিভিন্ন কাজ করে।

  • এ- noexceptক্লাউস বলেছেন, " ... (কিছু শর্ত) যখন এই ফাংশনটি বিনা মূল্যে হওয়া উচিত " " এটি একটি ফাংশন ঘোষণায় যায়, একটি বুলিয়ান প্যারামিটার নেয় এবং ঘোষিত কার্যক্রমে আচরণগত পরিবর্তন ঘটায়।

  • এ- noexceptএক্সপ্রেশন বলে, "সংকলক, দয়া করে আমাকে বলুন (কিছু অভিব্যক্তি) নন-গ্রহণযোগ্য কিনা " " এটি নিজেই একটি বুলিয়ান এক্সপ্রেশন। প্রোগ্রামটির আচরণে এর কোনও "পার্শ্ব প্রতিক্রিয়া" নেই - এটি কেবল একটি হ্যাঁ / কোনও প্রশ্নের উত্তরের জন্য সংকলককে জিজ্ঞাসা করছে। "এই অভিব্যক্তিটি কি বাকী?

আমরা যা করতে পারেন নীড় একটি noexceptএকটি ভিতরে -expression noexcept-clause, কিন্তু আমরা সাধারণত এটা খারাপ শৈলী তা করার কথা বিবেচনা করুন।

template<class T>
void incr(T t) noexcept(noexcept(++t));  // NOT SO HOT

এটি noexceptকোনও টাইপ-ট্রাইটে-এক্সপ্রেশনকে এমপ্যাপুলেট করার জন্য আরও ভাল স্টাইল হিসাবে বিবেচিত হয়।

template<class T> inline constexpr bool is_nothrow_incrable_v =
    noexcept(++std::declval<T&>());  // BETTER, PART 1

template<class T>
void incr(T t) noexcept(is_nothrow_incrable_v<T>);  // BETTER, PART 2

সি ++ 2 এ ওয়ার্কিং ড্রাফ্টটিতে " requiresক্লাস" এবং " requiresএক্সপ্রেসনস " রয়েছে। তারা বিভিন্ন কাজ করে।

  • এ- requiresক্লাউস বলেছেন, " ... (কিছু শর্ত থাকলে) এই ক্রিয়াকলাপটি ওভারলোড রেজোলিউশনে অংশ নেওয়া উচিত " " এটি একটি ফাংশন ঘোষণায় যায়, একটি বুলিয়ান প্যারামিটার নেয় এবং ঘোষিত কার্যক্রমে আচরণগত পরিবর্তন ঘটায়।

  • এ- requiresএক্সপ্রেশন বলে, "সংকলক, দয়া করে আমাকে বলুন (কিছু অভিব্যক্তি সেট) সুগঠিত হয়েছে কিনা ।" এটি নিজেই একটি বুলিয়ান এক্সপ্রেশন। প্রোগ্রামটির আচরণে এর কোনও "পার্শ্ব প্রতিক্রিয়া" নেই - এটি কেবল একটি হ্যাঁ / কোনও প্রশ্নের উত্তরের জন্য সংকলককে জিজ্ঞাসা করছে। "এই অভিব্যক্তিটি কি সুগঠিত?"

আমরা যা করতে পারেন নীড় একটি requiresএকটি ভিতরে -expression requires-clause, কিন্তু আমরা সাধারণত এটা খারাপ শৈলী তা করার কথা বিবেচনা করুন।

template<class T>
void incr(T t) requires (requires(T t) { ++t; });  // NOT SO HOT

এটি requiresটাইপ-বৈশিষ্ট্যে এক্সপ্রেশনকে এমপ্যাসুলেট করার জন্য আরও ভাল স্টাইল হিসাবে বিবেচিত হয় ...

template<class T> inline constexpr bool is_incrable_v =
    requires(T t) { ++t; };  // BETTER, PART 1

template<class T>
void incr(T t) requires is_incrable_v<T>;  // BETTER, PART 2

... বা একটি (সি ++ 2 এ ওয়ার্কিং ড্রাফ্ট) ধারণাটিতে।

template<class T> concept Incrable =
    requires(T t) { ++t; };  // BETTER, PART 1

template<class T>
void incr(T t) requires Incrable<T>;  // BETTER, PART 2

1
আমি আসলেই এই যুক্তিটি কিনছি না। noexceptসমস্যা হলো হয়েছে noexcept(f())মানে হতে পারে পারেন ব্যাখ্যা f()একটি বুলিয়ান যে আমরা স্পেসিফিকেশন সেট করতে ব্যবহার করছেন যেমন বা পরীক্ষা থাকুক বা না থাকুক f()হয় noexceptrequiresএই অস্পষ্টতা নেই কারণ এর বৈধতার জন্য এটি পরীক্ষা করার প্রকাশগুলি ইতিমধ্যে {}এস এর সাথে প্রবর্তন করতে হবে । তার পরে, যুক্তিটি মূলত "ব্যাকরণ তাই বলে।"
ব্যারি

@ ব্যারি: এই মন্তব্য দেখুন । এটি প্রদর্শিত হয় {}areচ্ছিক।
এরিক

1
@ এরিক optionচ্ছিক {}নয়, মন্তব্যটি এটি দেখায় না। যাইহোক, এটি পার্সিং অস্পষ্টতার প্রদর্শন করে একটি দুর্দান্ত মন্তব্য। সম্ভবত এই মন্তব্যটি (কিছু ব্যাখ্যা সহ) স্বতন্ত্র উত্তর হিসাবে গ্রহণ করবে
ব্যারি

1
requires is_nothrow_incrable_v<T>;হওয়া উচিতrequires is_incrable_v<T>;
রুসলান

16

আমি মনে করি সিপ্রেফারেন্সের ধারণাগুলি পৃষ্ঠাটি এটি ব্যাখ্যা করে। আমি "গণিত" দিয়ে তাই বলতে পারি, কেন এটি অবশ্যই এর মতো হতে হবে:

আপনি যদি কোনও ধারণাটি সংজ্ঞায়িত করতে চান তবে আপনি এটি করুন:

template<typename T>
concept Addable = requires (T x) { x + x; }; // requires-expression

আপনি যদি সেই ধারণাটি ব্যবহার করে এমন কোনও ফাংশন ঘোষণা করতে চান তবে আপনি এটি করুন:

template<typename T> requires Addable<T> // requires-clause, not requires-expression
T add(T a, T b) { return a + b; }

এখন আপনি যদি ধারণাটি আলাদাভাবে সংজ্ঞায়িত করতে না চান তবে আমি অনুমান করি আপনাকে যা করতে হবে তা হল কিছু প্রতিস্থাপন itution এই অংশটি নিন requires (T x) { x + x; };এবং অংশটি প্রতিস্থাপন করুন Addable<T>এবং আপনি পাবেন:

template<typename T> requires requires (T x) { x + x; }
T add(T a, T b) { return a + b; }

আপনি যা সম্পর্কে জিজ্ঞাসা করছেন


4
আমি মনে করি না যে প্রশ্নটি জিজ্ঞাসা করছে এটি। এটি ব্যাকরণটি আরও কম-বেশি ব্যাখ্যা করছে।
যাত্রী

তবে আপনি কেন তা করতে পারবেন না template<typename T> requires (T x) { x + x; }এবং প্রয়োজনীয়তাটি ক্লজ এবং এক্সপ্রেশন উভয়ই হতে পারে?
নাথান অলিভার

2
@ নাথানঅলিভার: কারণ আপনি সংকলককে একটি নির্মাণকে অন্যরকম হিসাবে ব্যাখ্যা করতে বাধ্য করছেন। একজন requires-as-বাধ্যতা দফা না আছে একটি হতে requires-expression। এটি কেবল এটির একটি সম্ভাব্য ব্যবহার।
নিকোল বোলাস

2
@ দ্য কিকান্টাম ফিজিসিস্ট আমার মন্তব্যে আমি যা পাচ্ছিলাম তা হ'ল এই উত্তরটি বাক্য গঠনটি ব্যাখ্যা করে। আমাদের কোন প্রকৃত প্রযুক্তিগত কারণ নেই requires requires। তারা ব্যাকরণে কিছু যোগ করার অনুমতি দিতে পারে template<typename T> requires (T x) { x + x; }তবে তারা তা করতে পারেনি। ব্যারি তারা কেন করেননি তা জানতে চায়
নাথান অলিভার

3
আমরা যদি এখানে সত্যিকারের-ব্যাকরণ-অস্পষ্টতা খেলি, ঠিক আছে, আমি কামড় দেব। Godbolt.org/z/i6n8kM এর template<class T> void f(T) requires requires(T (x)) { (void)x; }; অর্থ যদি আপনি কোনও একটিকে সরিয়ে দেন তবে ভিন্ন কিছু requires
কুক্সপ্লসোন

12

আমি এন্ড্রু সুতনের কাছ থেকে একটি মন্তব্য পেয়েছি (ধারণার অন্যতম লেখক, যিনি এটি সিসিটিতে প্রয়োগ করেছিলেন) এই ক্ষেত্রে যথেষ্ট সহায়ক হতে পারে, তাই আমি ভেবেছিলাম যে আমি কেবল এটির কাছাকাছি এখানে উদ্ধৃতি দিয়েছি:

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

তবে, ২০১ in সালে, এই বিধিনিষেধ শিথিল করার প্রস্তাব ছিল [সম্পাদকের নোট: পি0266 ]। কাগজের ৪ নং অনুচ্ছেদে অনুচ্ছেদ of এর স্ট্রাইকথ্রুটি নোট করুন। এবং এইভাবে জন্মগ্রহণ করা প্রয়োজন প্রয়োজন।

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

পাছে কেউ যাতে ভাবতে পারে যে আমি লেখার প্রতি সংবেদনশীল ছিলাম না তার জন্য দু'বার প্রয়োজন হয়, এটি সহজ করার জন্য আমি কিছু সময় ব্যয় করেছি। সংক্ষিপ্ত উত্তর: না।

সমস্যাটি হ'ল এখানে দুটি ব্যাকরণগত গঠন রয়েছে যা একটি টেম্পলেট প্যারামিটার তালিকার পরে প্রবর্তন করা দরকার: খুব সাধারণত একটি সীমাবদ্ধ অভিব্যক্তি (যেমন P && Q) এবং মাঝে মাঝে সিনট্যাকটিক প্রয়োজনীয়তা (পছন্দ requires (T a) { ... })। এটিকে একটি প্রয়োজন-অভিব্যক্তি বলা হয়।

প্রথমটি সীমাবদ্ধতার পরিচয় দেয় requires দ্বিতীয়টি প্রয়োজনীয়-প্রকাশের পরিচয় দেয় requires ব্যাকরণ রচনা ঠিক এইভাবে। আমি এটিকে মোটেই বিভ্রান্তিকর মনে করি না।

আমি চেষ্টা করেছি, এক পর্যায়ে এগুলিকে একক প্রয়োজনে ভেঙে দেওয়ার জন্য। দুর্ভাগ্যক্রমে, এটি কিছু গুরুতর কঠিন পার্সিং সমস্যার দিকে নিয়ে যায়। আপনি সহজেই বলতে পারবেন না, উদাহরণস্বরূপ যদি (প্রয়োজনের পরে কোনও নেস্টেড সুবেশন এক্সপ্রেশন বা প্যারামিটার-তালিকা বোঝায়। আমি বিশ্বাস করি না যে এই সিনট্যাক্সগুলির একটি নিখুঁত ছদ্মবেশ রয়েছে (অভিন্ন সূচনা সিনট্যাক্সের যুক্তি দেখুন; এই সমস্যাটিও আছে)।

সুতরাং আপনি একটি চয়ন করুন: মেক একটি এক্সপ্রেশন পরিচয় প্রয়োজন (এটি এখন যেমন হয়) বা এটি প্রয়োজনীয়তার একটি প্যারামিটারাইজড তালিকা প্রবর্তন করে।

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

আমি প্রয়োজনীয়গুলি একটি প্রয়োজনীয়-এক্সপ্রেশন পরিচয় করিয়ে দিতে পছন্দ করতে পারি। এটি আসলে আরও খারাপ, কারণ কার্যত আপনার সমস্ত বাধা এইরকম দেখতে শুরু করবে:

template<typename T>
  requires { requires Eq<T>; }
void f(T a, T b);

এখানে, ২ য় প্রয়োজনীয়কে নেস্টেড-প্রয়োজনীয়তা বলা হয়; এটি এর অভিব্যক্তিটি মূল্যায়ন করে (প্রয়োজনীয়-এক্সপ্রেশনটির ব্লকের অন্যান্য কোড মূল্যায়ন হয় না)। আমি মনে করি এটি স্থিতাবস্থার চেয়েও খারাপ। এখন, আপনার লেখার জন্য সর্বত্র দুবার প্রয়োজন।

আমি আরও কীওয়ার্ড ব্যবহার করতে পারে। এটি নিজেই একটি সমস্যা --- এবং এটি কেবল বাইক চালানো নয়। সদৃশতা এড়ানোর জন্য কীওয়ার্ডগুলিকে "পুনরায় বিতরণ" করার উপায় থাকতে পারে তবে আমি সেই গুরুতর চিন্তাভাবনা করি নি। তবে এটি সমস্যার মূলত পরিবর্তন করে না।


-10

কারণ আপনি বলছেন যে কোনও জিনিসের A এর B প্রয়োজন হয়, এবং প্রয়োজনীয় খ এর প্রয়োজনীয় সি থাকে C.

জিনিস A এর জন্য বি প্রয়োজন হয় যা ঘুরে ফিরে সি প্রয়োজন requires

"প্রয়োজনীয়" ধারাটি নিজেই কিছু প্রয়োজন।

আপনার কাছে জিনিস A আছে (বি এর প্রয়োজন (সি প্রয়োজন হয়))।

সাধরণ। :)


4
তবে অন্যান্য উত্তর অনুসারে, প্রথম এবং দ্বিতীয়টি requiresধারণাগতভাবে একই জিনিস নয় (একটিটি একটি ধারা, একটি একটি অভিব্যক্তি)। আসলে, যদি আমি সঠিকভাবে বুঝতে পারি তবে দুটি সেট ()ইন এর requires (requires (T x) { x + x; })খুব আলাদা অর্থ রয়েছে (বাইরেরটি beingচ্ছিক এবং সর্বদা বুলিয়ান কনস্টেক্সপ্রযুক্ত থাকে; অভ্যন্তরীণটি একটি প্রবর্তন করার বাধ্যতামূলক অঙ্গ হিসাবে প্রকাশের প্রয়োজন হয় এবং প্রকৃত অভিব্যক্তিগুলিকে অনুমতি না দেয়)।
সর্বাধিক লাংঘফ

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