এফডিআইএসের অসঙ্গতিগুলির জন্য একটি বিভাগ রয়েছে, পরিশিষ্ট C.2
"সি ++ এবং আইএসও সি ++ 2003" এ রয়েছে।
সংক্ষিপ্তসার, এফডিআইএসের প্যারাফ্রেসিং, এটি (আরও ভাল) এসও উত্তর হিসাবে উপযুক্ত করার জন্য। আমি পার্থক্যগুলি বর্ণনা করার জন্য আমার নিজের কয়েকটি উদাহরণ যুক্ত করেছি।
কয়েকটি গ্রন্থাগার-সম্পর্কিত অসঙ্গতি রয়েছে যেখানে আমি এর প্রভাবগুলি সম্পর্কে ঠিক জানি না, তাই আমি সেগুলি অন্যদের জন্য বিশদভাবে রেখে দেই।
মূল ভাষা
#define u8 "abc"
const char *s = u8"def"; // Previously "abcdef", now "def"
#define _x "there"
"hello"_x // now a user-defined-string-literal. Previously, expanded _x .
নতুন কীওয়ার্ড: অ্যালাইনাস, অ্যালাইনফ, চর 16_t, চার32_t, কনটেক্সপ্রপ্র, ডিক্লাইপ, নেক্সটপ্রেস, নাল্পটার, স্ট্যাটিক_সেটর এবং থ্রেড_লোকাল
দীর্ঘ দ্বারা প্রতিনিধিত্ব করা যেতে পারে এর চেয়ে বড় কিছু পূর্ণসংখ্যার অক্ষর একটি স্বাক্ষরবিহীন পূর্ণসংখ্যা টাইপ থেকে স্বাক্ষরিত দীর্ঘ দীর্ঘ হতে পারে।
বৈধ সি ++ 2003 কোড যা পূর্ণসংখ্যার বিভাগকে 0 এর দিকে বা নেতিবাচক অসীমের দিকে ঘিরে দেয়, যখন সি ++ 0x সর্বদা ফলাফলকে 0 এর দিকে গোল করে।
(স্বীকার করা সত্যিই বেশিরভাগ লোকের পক্ষে সামঞ্জস্যের সমস্যা নয়)।
বৈধ সি ++ 2003 কোড যা auto
স্টোরেজ শ্রেণীর নির্দিষ্টকরণকারী হিসাবে কীওয়ার্ডটি ব্যবহার করে সেটি সি ++ 0x এ অবৈধ হতে পারে।
সংকীর্ণ রূপান্তরগুলি C ++ 03 এর সাথে অসঙ্গতি সৃষ্টি করে। উদাহরণস্বরূপ, নিম্নলিখিত কোডটি সি ++ 2003 এ বৈধ তবে এই আন্তর্জাতিক স্ট্যান্ডার্ডটিতে অবৈধ কারণ ডাবল টু ইন্ট সংকীর্ণ রূপান্তর:
int x[] = { 2.0 };
সুস্পষ্টভাবে ঘোষিত বিশেষ সদস্য ক্রিয়াকলাপগুলি মুছে ফেলা হিসাবে মুছে ফেলা হয় যখন অন্তর্নিহিত সংজ্ঞাটি খারাপ-গঠিত হত।
একটি বৈধ সি ++ 2003 প্রোগ্রাম যা সংজ্ঞায়নের প্রয়োজন হয় না এমন প্রসঙ্গে এই বিশেষ সদস্য ফাংশনগুলির মধ্যে একটি ব্যবহার করে (উদাহরণস্বরূপ, কোনও এক্সপ্রেশনে যার সম্ভাব্য মূল্যায়ন হয় না) অসুস্থ হয়ে পড়ে becomes
আমার উদাহরণ:
struct A { private: A(); };
struct B : A { };
int main() { sizeof B(); /* valid in C++03, invalid in C++0x */ }
এই জাতীয় আকারের কৌশলগুলি কিছু SFINAE ব্যবহার করেছে এবং এখনই এটি পরিবর্তন করা দরকার :)
ব্যবহারকারী-ঘোষিত ডেস্ট্রাক্টরগুলির একটি অন্তর্নিহিত ব্যতিক্রম বিশদ রয়েছে।
আমার উদাহরণ:
struct A {
~A() { throw "foo"; }
};
int main() { try { A a; } catch(...) { } }
এই কোডটি terminate
সি ++ 0x এ কল করে, তবে সি ++ 03 এ নয়। কারণ A::~A
সি ++ 0 এক্স এর অন্তর্নিহিত ব্যতিক্রম স্পেসিফিকেশন noexcept(true)
।
একটি বৈধ সি ++ 2003 ঘোষণা export
সি ++ 0 এক্স-এ দূষিত।
>
অন্যের সাথে সাথে অনুসরণযোগ্য একটি বৈধ সি ++ 2003 এক্সপ্রেশনটি >
এখন দুটি টেমপ্লেট বন্ধ করে হিসাবে বিবেচিত হতে পারে।
সি ++ এ, >>
সর্বদা শিফট-অপারেটর টোকেন হবে।
অভ্যন্তরীণ সংযোগ সহ ফাংশনগুলির নির্ভরশীল কলগুলিকে মঞ্জুরি দিন।
আমার উদাহরণ:
static void f(int) { }
void f(long) { }
template<typename T>
void g(T t) { f(t); }
int main() { g(0); }
সি ++ এ, এই কলগুলি f(long)
, কিন্তু সি ++ 0 এক্সে, এই কলগুলি f(int)
। এটি লক্ষ করা উচিত যে সি ++ 03 এবং সি ++ 0 এক্স উভয় ক্ষেত্রেই নিম্নলিখিত কলগুলি f(B)
(ইনস্ট্যান্টেশন প্রসঙ্গে এখনও কেবলমাত্র বাহ্যিক সংযোগের ঘোষণাগুলি বিবেচনা করে)।
struct B { };
struct A : B { };
template<typename T>
void g(T t) { f(t); }
static void f(A) { }
void f(B) { }
int main() { A a; g(a); }
এর চেয়ে ভাল মিলটি f(A)
নেওয়া হয় নি, কারণ এতে বাহ্যিক সংযোগ নেই।
লাইব্রেরি পরিবর্তন
বৈধ সি ++ 2003 কোড যা সি ++ 0 এক্স এর সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে যুক্ত কোনও শনাক্তকারী ব্যবহার করে এই আন্তর্জাতিক স্ট্যান্ডার্ডটিতে বিভিন্ন ফলাফল সংকলন করতে বা উত্পাদন করতে ব্যর্থ হতে পারে।
বৈধ সি ++ 2003 কোড যা #includes
নতুন সি ++ 0x স্ট্যান্ডার্ড লাইব্রেরির শিরোনামগুলির নাম সহ এই আন্তর্জাতিক মানকটিতে অবৈধ হতে পারে।
বৈধ সি ++ 2003 কোডটি যা স্ব্যাপের মধ্যে থাকা আশা করে সংকলিত হয়েছে তার <algorithm>
পরিবর্তে অন্তর্ভুক্ত থাকতে পারে<utility>
বিশ্বব্যাপী নেমস্পেস posix
এখন মানীকরণের জন্য সংরক্ষিত।
বৈধ সি ++ 2003 কোডটি সংজ্ঞায়িত override
, final
, carries_dependency
, অথবা noreturn
ম্যাক্রো যেমন সি ++ 0x মধ্যে অবৈধ।
export
কীওয়ার্ডটির অর্থ সরিয়ে ফেলছেন ? আমি আমার কোট আনব।