নিম্নলিখিত কোড বিবেচনা করুন:
template <typename T> using VoidT = void;
class A {
public:
using TEST = int;
};
class C {
public:
using DIFFERENT = int;
};
template <typename T, typename Enable = void>
class B {
public:
B() = delete;
};
template <typename T>
class B<T, VoidT<typename T::TEST>> {
public:
B() = default;
};
template <typename T>
class B<T, VoidT<typename T::DIFFERENT>> {
public:
B() = default;
};
int main() {
B<A> a;
B<C> b;
return 0;
}
এই কোডটি সংকলন করে g ++ - 4.8.5 ব্যবহার করে আমাকে নিম্নলিখিত ত্রুটি বার্তাটি দেয়:
~/test/compile_test> g++ -std=c++11 test.cpp
test.cpp:31:7: error: redefinition of ‘class B<T, void>’
test.cpp:24:7: error: previous definition of ‘class B<T, void>’
যাইহোক, আমি যখন g ++ - 8.3 (ইন, উদাহরণস্বরূপ, আইডোন) ব্যবহার করে সংকলন করি তখন কোড সংকলন এবং বিভিন্ন বিশেষীকরণগুলি সঠিকভাবে বিবেচনা করা হয়। এটি কি জিসিসির কোনও বাগ ছিল যা সংশোধন করা হয়েছিল, বা আমি কোনওভাবেই অনির্ধারিত আচরণের প্রতি আহ্বান করছি (এবং তাই সংকলক আচরণের পার্থক্য একটি মূল বিষয় - এটি অপরিবর্তিত)?