সংক্ষিপ্ত উত্তর:
প্রায় না
দীর্ঘ উত্তর:
যখনই আপনার একটি 32 বিট সিস্টেমে 2 জিবি বড় চরের ভেক্টর লাগবে। অন্য প্রতিটি ব্যবহারের ক্ষেত্রে, স্বাক্ষরযুক্ত প্রকারটি স্বাক্ষরবিহীন প্রকারের চেয়ে বেশি নিরাপদ।
উদাহরণ:
std::vector<A> data;
[...]
// calculate the index that should be used;
size_t i = calc_index(param1, param2);
// doing calculations close to the underflow of an integer is already dangerous
// do some bounds checking
if( i - 1 < 0 ) {
// always false, because 0-1 on unsigned creates an underflow
return LEFT_BORDER;
} else if( i >= data.size() - 1 ) {
// if i already had an underflow, this becomes true
return RIGHT_BORDER;
}
// now you have a bug that is very hard to track, because you never
// get an exception or anything anymore, to detect that you actually
// return the false border case.
return calc_something(data[i-1], data[i], data[i+1]);
স্বাক্ষরিত সমতুল্য size_t
হয় ptrdiff_t
না int
। তবে int
সাইজ_টি এর চেয়ে বেশিরভাগ ক্ষেত্রে ব্যবহার করা আরও ভাল। ptrdiff_t
হয় long
32 এবং 64 বিট সিস্টেমে।
এর অর্থ হ'ল আপনি যখনই স্টাড :: ধারকগুলির সাথে ইন্ট্যারাক্ট করেন তখনই আপনাকে সর্বদা আকার_ টু থেকে রূপান্তর করতে হবে, যা খুব সুন্দর নয়। তবে একটি চলমান নেটিভ সম্মেলনে সি ++ এর লেখক উল্লেখ করেছেন যে একটি স্বাক্ষরযুক্ত সাইজ_টাকে স্ট্যান্ড :: ভেক্টর ডিজাইন করা একটি ভুল ছিল।
যদি আপনার সংকলক আপনাকে ptrdiff_t থেকে আকার_t পর্যন্ত অন্তর্নিহিত রূপান্তরগুলির বিষয়ে সতর্কতা দেয় তবে আপনি এটি নির্মাণকারীর বাক্য গঠন দিয়ে সুস্পষ্ট করতে পারেন:
calc_something(data[size_t(i-1)], data[size_t(i)], data[size_t(i+1)]);
যদি কেবল কোনও সংগ্রহকে পুনরাবৃত্তি করতে চান, সীমা ছাড়াই চেক করা, এর জন্য ভিত্তিক ব্যাপ্তিটি ব্যবহার করুন:
for(const auto& d : data) {
[...]
}
নেটিভ যাওয়ার সময় বাজার্ন স্ট্রস্ট্রপ (সি ++ লেখক) এর কিছু শব্দ এখানে
কিছু লোকের জন্য এসটিএলে এই স্বাক্ষরযুক্ত / স্বাক্ষরযুক্ত ডিজাইনের ত্রুটিটি যথেষ্ট কারণ, এসটিডি :: ভেক্টরটি ব্যবহার না করে বরং তার নিজস্ব বাস্তবায়ন।
size_t