হ্যাঁ, এমন অনেকগুলি পরিবর্তন রয়েছে যা একই কোডের ফলে সি ++ 03 এবং সি ++ 11 এর মধ্যে বিভিন্ন আচরণের কারণ হয়ে উঠবে। সিকোয়েন্সিং বিধিগুলির পার্থক্যগুলি কিছু পূর্বনির্ধারিত আচরণের সংজ্ঞা দেওয়া সহ কিছু আকর্ষণীয় পরিবর্তন করে।
1. প্রাথমিক পর্বের তালিকার মধ্যে একই ভেরিয়েবলের একাধিক রূপান্তর
একটি খুব আকর্ষণীয় কর্নারের কেস একটি প্রাথমিক সূচক তালিকার মধ্যে একই পরিবর্তনশীলটির একাধিক রূপান্তর করবে, উদাহরণস্বরূপ:
int main()
{
int count = 0 ;
int arrInt[2] = { count++, count++ } ;
return 0 ;
}
C ++ 03 এবং C ++ 11 উভয় ক্ষেত্রে এটি ভালভাবে সংজ্ঞায়িত হয়েছে তবে সি ++ 03 এর মূল্যায়নের ক্রমটি অনির্ধারিত তবে সি ++ 11 এ তারা যেভাবে প্রদর্শিত হবে তার ক্রমে মূল্যায়ন করা হয় । সুতরাং আমরা যদি clang
C ++ 03 মোডে ব্যবহার করে সংকলন করি তবে এটি নীচের সতর্কতা সরবরাহ করে ( এটি সরাসরি দেখুন ):
warning: multiple unsequenced modifications to 'count' [-Wunsequenced]
int arrInt[2] = { count++, count++ } ;
^ ~~
তবে সি ++ 11 এ সতর্কতা সরবরাহ করে না ( এটি সরাসরি দেখুন )।
2. নতুন সিকোয়েন্সিং বিধিগুলি i = ++ i + 1 করে; সি ++ 11 এ ভালভাবে সংজ্ঞায়িত হয়েছে
সি ++ 03 এর পরে গৃহীত নতুন সিকোয়েন্সিংয়ের অর্থ এর অর্থ:
int i = 0 ;
i = ++ i + 1;
সি ++ 11-এ আর কোনও অপরিজ্ঞাত আচরণ নেই, এটি ত্রুটি প্রতিবেদন 63৩ is- এ আচ্ছাদিত Se
৩. নতুন সিকোয়েন্সিং বিধিগুলিও ++++ i করে; সি ++ 11 এ ভালভাবে সংজ্ঞায়িত হয়েছে
সি ++ 03 এর পরে গৃহীত নতুন সিকোয়েন্সিংয়ের অর্থ এর অর্থ:
int i = 0 ;
++++i ;
সি ++ 11-এ আর কোনও পূর্বনির্ধারিত আচরণ নেই।
4. সামান্য আরও বোধগম্য বাম-শিফট স্বাক্ষরিত
সি ++ 11 এর পরে খসড়াগুলির মধ্যে অন্তর্ভুক্ত রয়েছে N3485
যা আমি নীচে সংযুক্ত করছি সাইন বিটটিতে 1 বিট স্থানান্তরিত করার বা অতীত করার অপরিজ্ঞাত আচরণটি স্থির করে । এটি ত্রুটি রিপোর্টেও অন্তর্ভুক্ত রয়েছে 1457 । হাওয়ার্ড হিন্যান্ট ইজ বাম-শিফটিং (<<) সি ++ 11- তে একটি নেতিবাচক পূর্ণসংখ্যার সংশোধিত আচরণের উপর থ্রেডে এই পরিবর্তনের তাত্পর্য সম্পর্কে মন্তব্য করেছিলেন ? ।
5. কনটেক্সট ফাংশনগুলি সি ++ 11 এ সংকলিত সময়ের ধ্রুবক এক্সপ্রেশন হিসাবে বিবেচনা করা যেতে পারে
সি ++ 11 প্রবর্তিত কনটেক্সট ফাংশন যা:
কনস্টেক্সপ্র স্পেসিফায়ার ঘোষণা করে যে সংকলন সময়ে ফাংশনের মূল্য বা পরিবর্তনশীল মূল্য নির্ধারণ করা সম্ভব। এই ধরণের পরিবর্তনশীল এবং ফাংশনগুলি তখন ব্যবহার করা যেতে পারে যেখানে কেবল সংকলন করার সময় ধ্রুবক প্রকাশের অনুমতি দেওয়া হয়।
যদিও সি ++ 03 তে কনস্টেক্সপ্র বৈশিষ্ট্য নেই আমাদের স্ট্যান্ডার্ড লাইব্রেরি কনস্টেক্সপ্র হিসাবে C ++ 11 তে অনেকগুলি ফাংশন সরবরাহ করে সেহেতু স্পষ্টভাবে কনসেক্সপ্রপ কীওয়ার্ডটি ব্যবহার করতে হবে না । উদাহরণস্বরূপ std :: numeric_limits :: min । যা বিভিন্ন আচরণের দিকে পরিচালিত করতে পারে, উদাহরণস্বরূপ:
#include <limits>
int main()
{
int x[std::numeric_limits<unsigned int>::min()+2] ;
}
ব্যবহার clang
C ++ 03 এই কারণ হবে x
একটি পরিবর্তনশীল দৈর্ঘ্য অ্যারে, যা হতে একটি এক্সটেনশন এবং নিম্নলিখিত সতর্কবার্তা উৎপন্ন হবে:
warning: variable length arrays are a C99 feature [-Wvla-extension]
int x[std::numeric_limits<unsigned int>::min()+2] ;
^
সি ++ এ থাকা অবস্থায় std::numeric_limits<unsigned int>::min()+2
একটি সংকলন সময় ধ্রুবক প্রকাশ এবং ভিএলএ এক্সটেনশনের প্রয়োজন হয় না।
C. সি ++ ১১ এ নষ্ট ব্যতিক্রমের স্পেসিফিকেশনগুলি স্পষ্টভাবে আপনার ধ্বংসকারীদের জন্য তৈরি করা হয়েছে
যেহেতু সি ++ ১১ তে ব্যবহারকারী সংজ্ঞায়িত ডেস্ট্রাক্টর নিখরচায় ডেস্ট্রাক্টরগুলিতেnoexcept(true)
ব্যাখ্যা করেছেন তেমন স্পষ্ট স্পেসিফিকেশন রয়েছে যার অর্থ নিম্নলিখিত প্রোগ্রাম:
#include <iostream>
#include <stdexcept>
struct S
{
~S() { throw std::runtime_error(""); } // bad, but acceptable
};
int main()
{
try { S s; }
catch (...) {
std::cerr << "exception occurred";
}
std::cout << "success";
}
সি ++ এ কল করবে std::terminate
তবে সি ++ 03 এ সফলভাবে চলবে।
7. সি ++ 03 এ টেমপ্লেট আর্গুমেন্টের অভ্যন্তরীণ লিঙ্কেজ থাকতে পারে না
এটি স্টাডি :: সাজানোর ক্ষেত্রে কোনও ফাংশনের মধ্যে ঘোষিত ক্লাসের তুলনা মেনে নেয় না কেন তা দুর্দান্তভাবে আচ্ছাদিত । সুতরাং নিম্নলিখিত কোডটি সি ++ 03 এ কাজ করা উচিত নয়:
#include <iostream>
#include <vector>
#include <algorithm>
class Comparators
{
public:
bool operator()(int first, int second)
{
return first < second;
}
};
int main()
{
class ComparatorsInner : public Comparators{};
std::vector<int> compares ;
compares.push_back(20) ;
compares.push_back(10) ;
compares.push_back(30) ;
ComparatorsInner comparatorInner;
std::sort(compares.begin(), compares.end(), comparatorInner);
std::vector<int>::iterator it;
for(it = compares.begin(); it != compares.end(); ++it)
{
std::cout << (*it) << std::endl;
}
}
কিন্তু বর্তমানে clang
একটি সতর্কবার্তা যদি না আপনি ব্যবহার সঙ্গে সি ++ 03 মোডে এই কোড পারবেন -pedantic-errors
পতাকা, কিনতে হত ধরনের যা, এটা লাইভ দেখতে পাবেন ।
৮. >> একাধিক টেম্পলেট বন্ধ করার সময় আর অসুস্থ হয় না
>>
একাধিক টেম্পলেটগুলি বন্ধ করতে ব্যবহার করা আর অসুস্থ নয় তবে সি ++ 03 এবং সি + 11 এর বিভিন্ন ফলাফল সহ কোডে পৌঁছে দিতে পারে। নীচের উদাহরণটি ডান কোণ বন্ধনী এবং পিছনের দিকের সামঞ্জস্য থেকে নেওয়া হয়েছে :
#include <iostream>
template<int I> struct X {
static int const c = 2;
};
template<> struct X<0> {
typedef int c;
};
template<typename T> struct Y {
static int const c = 3;
};
static int const c = 4;
int main() {
std::cout << (Y<X<1> >::c >::c>::c) << '\n';
std::cout << (Y<X< 1>>::c >::c>::c) << '\n';
}
এবং সি ++ 03 এর ফলাফল হ'ল:
0
3
এবং সি ++ 11 এ:
0
0
9. সি ++ 11 স্ট্যান্ড :: ভেক্টর কনস্ট্রাক্টরগুলির মধ্যে কিছু পরিবর্তন করে
এই উত্তর থেকে কিছুটা সংশোধিত কোড দেখায় যে নিম্নলিখিত স্ট্যান্ডার্ড :: ভেক্টর থেকে নির্মাণকারীর ব্যবহার :
std::vector<T> test(1);
সি ++ 03 এবং সি ++ 11 এ বিভিন্ন ফলাফল উত্পাদন করে:
#include <iostream>
#include <vector>
struct T
{
bool flag;
T() : flag(false) {}
T(const T&) : flag(true) {}
};
int main()
{
std::vector<T> test(1);
bool is_cpp11 = !test[0].flag;
std::cout << is_cpp11 << std::endl ;
}
10. সামগ্রিক প্রারম্ভিকগুলিতে সংকীর্ণ রূপান্তর
সি ++ ১১-তে সামগ্রিক প্রারম্ভিকদের মধ্যে সংকীর্ণ রূপান্তরটি দুর্গঠিত এবং দেখে মনে হচ্ছে এটি gcc
সি ++ 11 এবং সি ++ 03 উভয় ক্ষেত্রেই অনুমতি দেয় যদিও এটি সি ++ 11 এ ডিফল্টরূপে একটি সতর্কতা প্রদান করে:
int x[] = { 2.0 };
এটি খসড়া সি ++ 11 স্ট্যান্ডার্ড বিভাগের 8.5.4
তালিকা-সূচনা অনুচ্ছেদ 3 এ আচ্ছাদিত রয়েছে :
টি-এর একটি অবজেক্টের রেফারেন্স-ইনিশায়ালাইজেশন বা রেফারেন্স নীচে সংজ্ঞায়িত করা হয়েছে:
এবং নিম্নলিখিত বুলেট রয়েছে ( জোর দেওয়া খনি ):
অন্যথায়, টি যদি শ্রেণীর ধরণের হয় তবে নির্মাতারা বিবেচনা করা হয়। প্রযোজ্য কন্সট্রাক্টরগুলি গণনা করা হয় এবং ওভারলোড রেজোলিউশনের (13.3, 13.3.1.7) মাধ্যমে সেরাটি বেছে নেওয়া হয়। যদি কোনও সংকীর্ণ রূপান্তর (নীচে দেখুন) কোনও আর্গুমেন্ট রূপান্তর করতে প্রয়োজন হয়, প্রোগ্রামটি দুর্গঠিত
এটি এবং আরও অনেক উদাহরণ সি ++ স্ট্যান্ডার্ড বিভাগ annex C.2
সি ++ এবং আইএসও সি ++ 2003 খসড়াতে আচ্ছাদিত । এর মধ্যে রয়েছে:
নতুন ধরণের স্ট্রিং লিটারাল [...] বিশেষত, স্ট্রিং আক্ষরিক সংলগ্ন যখন আর, ইউ 8, ইউ 8 আর, ইউ, ইউআর, ইউ, ইউআর, বা এলআর নামের ম্যাক্রোগুলি প্রসারিত হবে না তবে স্ট্রিং আক্ষরিক অংশ হিসাবে ব্যাখ্যা করা হবে । উদাহরণ স্বরূপ
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
ব্যবহারকারী-সংজ্ঞায়িত আক্ষরিক স্ট্রিং সমর্থন [...] পূর্বে, # 1 এ দুটি পৃথক প্রিপ্রোসেসিং টোকেন এবং ম্যাক্রো _ এক্স প্রসারিত হত। এই আন্তর্জাতিক স্ট্যান্ডার্ডে, # 1 টিতে একটি একক প্রিপ্রোসেসিং টোকেন থাকে, সুতরাং ম্যাক্রো প্রসারিত হয় না।
#define _x "there"
"hello"_x // #1
পূর্ণসংখ্যার / এবং% [...] 2003 কোডের ফলাফলের জন্য রাউন্ডিং নির্দিষ্ট করুন যা সংখ্যার বিভাগের ব্যবহার করে 0 টি বা নেতিবাচক অসীমের দিকে গোল করে, যখন এই আন্তর্জাতিক স্ট্যান্ডার্ড সর্বদা ফলাফলকে 0 এর দিকে গোল করে।
আকারের জটিলতা () সদস্যের ফাংশনগুলি এখন ধ্রুবক [...] সি ++ 2003 অনুসারে কিছু ধারক বাস্তবায়ন এই আন্তর্জাতিক স্ট্যান্ডার্ডের নির্দিষ্ট আকার () প্রয়োজনীয়তার সাথে সঙ্গতিপূর্ণ নাও হতে পারে। স্ট্র্যাটার প্রয়োজনীয়তার সাথে স্ট্যান্ড :: তালিকার মতো পাত্রে সামঞ্জস্য করার ক্ষেত্রে বেমানান পরিবর্তনগুলির প্রয়োজন হতে পারে।
Std :: ios_base :: এর ব্যাস ক্লাস পরিবর্তন করুন ব্যর্থতা [...] std :: ios_base :: ব্যর্থতা আর সরাসরি স্ট্যান্ড :: ব্যতিক্রম থেকে প্রাপ্ত নয়, তবে এখন std :: system_error থেকে উদ্ভূত, যা পরিবর্তিতভাবে থেকে প্রাপ্ত এসটিডি :: runtime_error। বৈধ সি ++ 2003 কোড যা ধরে নিয়েছে যে এইচটিডি: আইওএস_বেস :: ব্যর্থতা সরাসরি এসটিডি থেকে উদ্ভূত হয়েছে :: ব্যতিক্রমটি এই আন্তর্জাতিক স্ট্যান্ডার্ডে ভিন্নভাবে কার্যকর করতে পারে।
auto
এরকম পরিস্থিতিতে এমন এক পরিণতি আসতে পারে