সঠিক ঠিকানা সহ একটি পয়েন্টার এবং টাইপ করা এখনও সি ++ 17 থেকে সর্বদা একটি বৈধ পয়েন্টার?


84

( এই প্রশ্ন এবং উত্তর প্রসঙ্গে ।)

সি ++ 17 স্ট্যান্ডার্ডের পূর্বে, নিম্নলিখিত বাক্যটি [বেসামাল ডটকম / পাউন্ড] / 3 এ অন্তর্ভুক্ত ছিল :

টি টাইপের কোনও অবজেক্ট যদি কোনও ঠিকানা এ-তে অবস্থিত হয়, তবে সিভি টি * টাইপের একটি পয়েন্টার, যার মান ঠিকানা হ'ল সেই মানটি কীভাবে প্রাপ্ত হয়েছিল তা নির্বিশেষে object বস্তুটিকে নির্দেশ করতে বলা হয়।

তবে সি ++ 17 সাল থেকে এই বাক্যটি সরানো হয়েছে ।

উদাহরণস্বরূপ আমি বিশ্বাস করি যে এই বাক্যটি এই উদাহরণ কোডটিকে সংজ্ঞায়িত করেছে এবং সি ++ 17 যেহেতু এটি অনির্ধারিত আচরণ:

 alignas(int) unsigned char buffer[2*sizeof(int)];
 auto p1=new(buffer) int{};
 auto p2=new(p1+1) int{};
 *(p1+1)=10;

সি ++ 17 এর আগে, p1+1ঠিকানাটি ধরে রাখে *p2এবং সঠিক টাইপ থাকে, তাই এতে *(p1+1)পয়েন্টার *p2। সি ++ এ 17 শেষের দিকেরp1+1 একটি পয়েন্টার , সুতরাং এটি কোনও হয় না আপত্তি করার জন্য কোনও পয়েন্টার এবং আমি বিশ্বাস করি এটি ডিটারফেন্সযোগ্য নয়।

মানদণ্ডের এই সংশোধনটির এই ব্যাখ্যাটি কি সঠিক বা অন্য কোন নিয়ম রয়েছে যা উদ্ধৃত বাক্যটি মুছে ফেলার ক্ষতিপূরণ দেয়?


নোট: সেখানে [basic.stc.dynamic.safety] এ পয়েন্টার উত্স এবং [util.dynamic.safety] সম্পর্কে নতুন / আপডেট নিয়ম আছে
এম এম

@ এমএম এটি কেবল কঠোর পয়েন্টার সুরক্ষার সাথে বাস্তবায়নের জন্য গুরুত্বপূর্ণ, যা একটি খালি সেট (পরীক্ষামূলক ত্রুটির মধ্যে)।
টিসি

4
উদ্ধৃত বিবৃতি বাস্তবে বাস্তবে কখনই সত্য ছিল না। দেওয়া হয়েছে int a, b = 0;, *(&a + 1) = 1;আপনি চেক করে নিলেও করতে পারবেন না &a + 1 == &b। আপনি যদি কেবল কোনও ঠিকানার ঠিকানা অনুমান করে কোনও বৈধ পয়েন্টার পেতে পারেন, তবে এমনকি স্থানীয় ভেরিয়েবলগুলি রেজিস্টারে সংরক্ষণ করা সমস্যাযুক্ত হয়ে ওঠে।
টিসি

@ টিটিসি 1) কোন সংকলক আপনি এর ঠিকানা নেওয়ার পরে তা নিয়মিত পরিবর্তন করেছেন? 2) আপনি কোনও ঠিকানাটি পরিমাপ না করে কীভাবে সঠিকভাবে অনুমান করতে পারেন?
কৌতূহলী

@ কুরিয়াসগুয়ে হুবহু এজন্যই কেবল কোনও উপায়ে ঘটেছিল এমন ঠিকানায় অন্য উপায়ে প্রাপ্ত (যেমন অনুমান করা) একটি সংখ্যা ingালাই সমস্যাযুক্ত: এটি সেই বস্তুর নাম রাখে তবে সংকলক এটি সচেতন নয়। যদি আপনি, বিপরীতে, অবজেক্টের ঠিকানাটি আপনি যেমন বলেছিলেন তেমন গ্রহণ করুন: সংকলকটি সতর্ক করা হয়েছে এবং সেই অনুসারে সিঙ্ক হয়।
পিটার - মনিকা

উত্তর:


45

মানদণ্ডের এই সংশোধনটির এই ব্যাখ্যাটি কি সঠিক বা অন্য কোনও নিয়ম রয়েছে যা এই উদ্ধৃত বাক্যটি মোছার ক্ষতিপূরণ দেয়?

হ্যাঁ, এই ব্যাখ্যাটি সঠিক। শেষের পূর্বের একটি পয়েন্টারটি কেবলমাত্র অন্য কোনও পয়েন্টার মানের পরিবর্তিত হয় না যা সেই ঠিকানার দিকে নির্দেশ করে।

নতুন [বেসিক ডটকম / পাউন্ড] / 3 বলেছেন:

পয়েন্টার ধরণের প্রতিটি মান হ'ল নিম্নলিখিতগুলির মধ্যে একটি:
(৩.১) কোনও বস্তু বা ফাংশনটির জন্য একটি পয়েন্টার (পয়েন্টারটি অবজেক্ট বা ফাংশনকে নির্দেশ করতে বলা হয়), বা
(৩.২) কোনও অবজেক্টের শেষে পয়েন্টার ([এক্সপ্রেস)) .add]), বা

এগুলি পারস্পরিক একচেটিয়া। p1+1শেষের দিকের পয়েন্টার, কোনও বস্তুর পয়েন্টার নয়। p1+1একটি প্রকল্পিত পয়েন্ট x[1]এ একটি আকার-1 অ্যারের p1নয় যোগদানp2 । এই দুটি বস্তু পয়েন্টার-আন্তঃ রূপান্তরযোগ্য নয়।

আমাদের কাছে মানহীন নোটও রয়েছে:

[দ্রষ্টব্য: কোনও অবজেক্টের শেষের পূর্বের একটি পয়েন্টার ([expr.add]) অবজেক্টের ধরণের কোনও সম্পর্কযুক্ত অবজেক্টের দিকে চিহ্নিত করা হয় না যা সেই ঠিকানায় অবস্থিত হতে পারে। [...]

যা উদ্দেশ্য স্পষ্ট করে।


যেমন টিসি অসংখ্য মন্তব্যে ( উল্লেখযোগ্যভাবে এটি ) উল্লেখ করেছেন, এটি বাস্তবায়নের চেষ্টা করার সাথে সমস্যাটি আসলেই একটি বিশেষ কেস std::vector- যা হ'ল [v.data(), v.data() + v.size())একটি বৈধ পরিসর হওয়া দরকার এবং এখনও vectorএকটি অ্যারে অবজেক্ট তৈরি করা হয়নি , তাই কেবল সংজ্ঞায়িত পয়েন্টার গাণিতিকটি ভেক্টরের কোনও প্রদত্ত বস্তু থেকে এর অনুমানিক এক-আকারের অ্যারের অতীত-শেষের দিকে যাবে। আরও সংস্থানসমূহের জন্য, দেখুন সিডব্লুজি 2182 , এই স্টাডি আলোচনা এবং এই বিষয়টির উপর একটি কাগজের দুটি সংশোধনী: P0593R0 এবং P0593R1 (বিভাগ 1.3 বিশেষত)।


4
এই উদাহরণটি মূলত পরিচিত " vectorবাস্তবায়ন সমস্যা" এর একটি বিশেষ ক্ষেত্রে । +1
টিসি

4
@ অলিভ সি ++ 03 সাল থেকে সাধারণ ক্ষেত্রে বিদ্যমান রয়েছে। মূল কারণ হ'ল পয়েন্টার গাণিতিক প্রত্যাশার মতো কাজ করছে না কারণ আপনার কোনও অ্যারে অবজেক্ট নেই।
টিসি

4
@ টিটিসি আমি বিশ্বাস করেছিলাম যে একমাত্র সমস্যা পয়েন্টার গাণিতিকের উপর নিষেধাজ্ঞার ফলে এসেছে। এই বাক্য মোছা কি নতুন সমস্যা যুক্ত করে না? কোড উদাহরণটি কি প্রি-সি ++ 17 এও ইউবি?
অলিভ

4
@ অলিভ যদি পয়েন্টার গাণিতিকটি স্থির হয় তবে আপনার p1+1আর কোনও অতীত-শেষের পয়েন্টার তৈরি হবে না এবং অতীত-শেষের পয়েন্টারগুলি সম্পর্কে পুরো আলোচনাটি মোট। আপনার নির্দিষ্ট দ্বি-উপাদান বিশেষ ক্ষেত্রে ইউবি প্রি 17 নাও হতে পারে তবে এটি খুব আকর্ষণীয়ও নয়।
টিসি

4
@ টিটিসি আপনি কি আমাকে এমন কোনও জায়গায় নির্দেশ করতে পারেন যে আমি এই "ভেক্টর বাস্তবায়ন সমস্যা" পড়তে পারি?
স্যারগ্যু

8

আপনার উদাহরণে, *(p1 + 1) = 10;ইউবি হওয়া উচিত, কারণ এটি অ্যারের শেষের অতীত আকারের 1 তবে আমরা এখানে একটি বিশেষ ক্ষেত্রে আছি, কারণ অ্যারেটি গতিশীলভাবে বৃহত্তর চর অ্যারেতে নির্মিত হয়েছিল।

ডায়নামিক অবজেক্ট ক্রিয়েশনটি সি ++ স্ট্যান্ডার্ডের এন 4659 খসড়ার The.৪ সি ++ অবজেক্ট মডেল [ইন্ট্রো.বজেক্ট] , in3 এ বর্ণিত হয়েছে :

3 যদি "এন স্বাক্ষরিত চরের অ্যারে" বা "এন স্টাড :: বাইটের অ্যারে" (21.2.1) টাইপের অন্য কোনও অবজেক্টের সাথে সম্পর্কিত স্টোরেজে একটি সম্পূর্ণ অবজেক্ট তৈরি করা হয় (8.3.4), তবে অ্যারে স্টোরেজ সরবরাহ করে তৈরি বস্তুর জন্য যদি:
(৩.১) - ই এর জীবদ্দশায় শুরু হয়েছে এবং শেষ হয়নি, এবং
(৩.২) - নতুন অবজেক্টের জন্য স্টোরেজ সম্পূর্ণরূপে ইয়ের মধ্যে ফিট করে, এবং
(৩.৩) - এর চেয়ে ছোট কোনও অ্যারে অবজেক্ট নেই যা এগুলি সন্তুষ্ট করে সীমাবদ্ধতা

3.3 বরং অস্পষ্ট বলে মনে হচ্ছে, তবে নীচের উদাহরণগুলি উদ্দেশ্যটিকে আরও স্পষ্ট করে তুলেছে:

struct A { unsigned char a[32]; };
struct B { unsigned char b[16]; };
A a;
B *b = new (a.a + 8) B; // a.a provides storage for *b
int *p = new (b->b + 4) int; // b->b provides storage for *p
// a.a does not provide storage for *p (directly),
// but *p is nested within a (see below)

উদাহরণস্বরূপ, bufferঅ্যারে উভয় এবং এর জন্য স্টোরেজ সরবরাহ করে*p1*p2

নিম্নলিখিত অনুচ্ছেদগুলি প্রমাণ করে যে উভয়ের জন্য সম্পূর্ণ বস্তু *p1এবং *p2এটি buffer:

4 একটি বস্তুর a অন্য অবজেক্টের মধ্যে
বাসা বাঁধে যদি: (4.1) - a খ এর একটি সাবওবজেক্ট বা
(4.2) - বি এর জন্য স্টোরেজ সরবরাহ করে, বা
(৪.৩) এর - সেখানে একটি অবজেক্ট সি রয়েছে যেখানে গ এর ভিতরে বাসা থাকে , এবং সি খ এর মধ্যে বাসা বাঁধে।

5 প্রতিটি অবজেক্ট এক্স এর জন্য কিছু অবজেক্ট থাকে যার নাম এক্স এর সম্পূর্ণ অবজেক্ট, নীচে নির্ধারিত হয়:
(5.1) - এক্স যদি একটি সম্পূর্ণ অবজেক্ট হয় তবে এক্স এর সম্পূর্ণ অবজেক্টটি নিজেই হয়।
(5.2) - অন্যথায়, x এর সম্পূর্ণ অবজেক্টটি (অনন্য) অবজেক্টের সম্পূর্ণ অবজেক্ট যা এক্স থাকে।

এটি একবার প্রতিষ্ঠিত হয়ে গেলে, সি ++ 17 এর জন্য খসড়া এন 4659 এর অন্যান্য প্রাসঙ্গিক অংশটি হল [বেসিক.কম্পাউন্ড] §3 (খনিতে জোর দিন):

3 ... পয়েন্টার ধরণের প্রতিটি মান নিম্নলিখিতগুলির মধ্যে একটি:
(3.1) - কোনও বস্তু বা ক্রিয়াকলাপের জন্য পয়েন্টার (পয়েন্টারটিকে বস্তু বা ফাংশনকে নির্দেশ করতে বলা হয়), বা
(3.2) - শেষের একটি পয়েন্টার কোনও অবজেক্টের (8.7), বা
(3.3) - এই ধরণের জন্য নাল পয়েন্টার মান (7.11), বা
(3.4) - একটি অবৈধ পয়েন্টার মান।

একটি পয়েন্টার ধরণের মান যা কোনও বস্তুর শেষের দিকে বা অতীতকে নির্দেশ করে বস্তুর দ্বারা দখলকৃত স্টোরেজ শেষ হওয়ার পরে মেমরিতে প্রথম বাইটের (4.4) দখল করা বা স্মৃতিতে প্রথম বাইটের ঠিকানা উপস্থাপন করে যথাক্রমে [দ্রষ্টব্য: কোনও অবজেক্টের (8.7) শেষের একটি পয়েন্টার কোনও সম্পর্কহীনকে নির্দেশ করার জন্য বিবেচনা করা হয় নাঅবজেক্টের ধরণের জিনিস যা সেই ঠিকানায় অবস্থিত হতে পারে। একটি পয়েন্টার মানটি অবৈধ হয়ে যায় যখন স্টোরেজটি বোঝায় যে এটি তার সঞ্চয়স্থানের সময়কালের শেষে পৌঁছে; 6.7 দেখুন। Noteend নোট] পয়েন্টার গাণিতিক (8.7) এবং তুলনা (8.9, 8.10) এর উদ্দেশ্যে, এন অ্যারের x অ্যারের শেষ উপাদানটির শেষের পূর্বের একটি পয়েন্টারকে অনুমানক উপাদান x এর সাথে পয়েন্টারের সমতুল্য হিসাবে বিবেচনা করা হয় [ n]। পয়েন্টার ধরণের মান উপস্থাপনা বাস্তবায়ন-সংজ্ঞায়িত। বিন্যাস-সামঞ্জস্যপূর্ণ ধরণের পয়েন্টারগুলির একই মান উপস্থাপনা এবং প্রান্তিককরণের প্রয়োজনীয়তা (6.11) থাকতে হবে ...

নোট শেষে গত একটি পয়েন্টার ... এখানে প্রযোজ্য না, কারণ বস্তু দ্বারা প্রতি ইঙ্গিত p1এবং p2এবং সম্পর্কহীন , কিন্তু একই সম্পূর্ণ বস্তুর মধ্যে নেস্টেড, তাই পয়েন্টার arithmetics অবজেক্টের অভ্যন্তরে অর্থে যে স্টোরেজ প্রদান করুন: p2 - p1সংজ্ঞায়িত করা হয় এবং (&buffer[sizeof(int)] - buffer]) / sizeof(int)যে 1।

সুতরাং p1 + 1 এটি একটি পয়েন্টার *p2, এবং *(p1 + 1) = 10;আচরণ সংজ্ঞায়িত করেছে এবং এর মান নির্ধারণ করে *p2


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

বিশেষত, এটি কোনও ডিফল্ট নির্মাণকারী না করে কোনও শ্রেণীর অবজেক্টের অ্যারের সাধারণ গতিশীল নির্মাণকে পরাস্ত করবে:

class T {
    ...
    public T(U initialization) {
        ...
    }
};
...
unsigned char *mem = new unsigned char[N * sizeof(T)];
T * arr = reinterpret_cast<T*>(mem); // See the array as an array of N T
for (i=0; i<N; i++) {
    U u(...);
    new(arr + i) T(u);
}

arr তারপরে কোনও অ্যারের প্রথম উপাদানটির পয়েন্টার হিসাবে ব্যবহার করা যেতে পারে ...


আহা, তাই পৃথিবী পাগল হয়ে যায় নি। +1
স্টোরি টেলার - আনস্ল্যান্ডার মনিকা

@ স্টিরিটেলার: আমিও আশা করি। সামঞ্জস্যতা বিভাগে এটি সম্পর্কে একটি শব্দও নয়। তবে দেখে মনে হচ্ছে বিপরীত মতামতটি এখানে আরও খ্যাতি পেয়েছে ...
সের্জ বাল্টেস্তা

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

4
@ টিটিসি: গুগল এই "ভেক্টর বাস্তবায়নের সমস্যা" সম্পর্কিত কোনও তথ্য সনাক্ত করতে খুব অসন্তুষ্ট, আপনি কি সহায়তা করতে পারেন?
ম্যাথিউ এম।

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

1

এখানে বর্ণিত উত্তরের উপর প্রসারিত করা আমি বিশ্বাস করি যে সংশোধিত শব্দগুচ্ছ বাদ দিচ্ছে না তার একটি উদাহরণ:

সতর্কতা: অপরিজ্ঞাত আচরণ hav

#include <iostream>
int main() {
    int A[1]{7};
    int B[1]{10};
    bool same{(B)==(A+1)};

    std::cout<<B<< ' '<< A <<' '<<sizeof(*A)<<'\n';
    std::cout<<(same?"same":"not same")<<'\n';
    std::cout<<*(A+1)<<'\n';//!!!!!  
    return 0;
}

সম্পূর্ণ বাস্তবায়ন নির্ভর (এবং ভঙ্গুর) কারণে এই প্রোগ্রামের সম্ভাব্য আউটপুটটি হ'ল:

0x7fff1e4f2a64 0x7fff1e4f2a60 4
same
10

এই আউটপুটটি দেখায় যে দুটি অ্যারে (সেক্ষেত্রে) মেমোরিতে সংরক্ষণ করা হয় যা 'শেষের অতীত' এর Aপ্রথম উপাদানটির ঠিকানার মান ধরে যায়B

সংশোধিত স্পেসিফিকেশন নিশ্চিত করছে যে নির্বিশেষে A+1কখনই এর বৈধ পয়েন্টার নয় B। পুরানো বাক্যাংশ 'মূল্য কীভাবে প্রাপ্ত হয় নির্বিশেষে' বলে যে 'A + 1' যদি 'B [0]' এর দিকে নির্দেশ করে তবে এটি 'B [0]' এর বৈধ পয়েন্টার। এটি ভাল হতে পারে না এবং অবশ্যই উদ্দেশ্য কখনও হয় না।


এটি কি কার্যকরভাবে কোনও কাঠামোর শেষে একটি খালি অ্যারের ব্যবহারের পক্ষে সাবস্ক্রাইব করে যে কোনও উদ্ভূত শ্রেণি বা কাস্টম বরাদ্দকারী নতুন কোনও কাস্টম-আকারের অ্যারে নির্দিষ্ট করতে পারে? সম্ভবত নতুন সমস্যাটি "যেভাবেই নির্বিশেষে" নিয়ে রয়েছে - এমন কিছু উপায় রয়েছে যা বৈধ এবং কিছু উপায় বিপজ্জনক?
রত্ন টেলর

@ পার্সিক্স্টি সুতরাং পয়েন্টার অবজেক্টের মান বস্তুর বাইট দ্বারা নির্ধারিত হয় এবং অন্য কিছুই নয়। সুতরাং একই পদযুক্ত দুটি বস্তু একই বস্তুর দিকে নির্দেশ করে। যদি একটি বৈধ হয়, অন্যটিও হয়। সুতরাং সাধারণ স্থাপত্যগুলিতে যেখানে একটি পয়েন্টার মানটি একটি সংখ্যা হিসাবে উপস্থাপিত হয় সেখানে দুটি পয়েন্টার সমান মানগুলির সাথে একই বস্তুগুলিকে নির্দেশ করে এবং শেষের একটিতে একই অন্যান্য অবজেক্টগুলিকে নির্দেশ করে।
কৌতূহলী

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

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

@ কুরিজগুই এছাড়াও, সম্ভাব্য মানগুলি গণনা করে আপনি কী বোঝাতে চেয়েছেন তা আমি নিশ্চিত নই। এটি সি ++ দ্বারা সংজ্ঞায়িত হিসাবে তুচ্ছ একটি প্রয়োজনীয় বৈশিষ্ট্য নয়।
পার্সিস্টি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.