निम्नलिखित कोड पर विचार करें:
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 (जैसे, उदाहरण के लिए, ideone) का उपयोग करके संकलन करता हूं, तो कोड संकलित होता है और विभिन्न विशेषज्ञताओं का सही तरीके से इलाज किया जाता है। क्या यह जीसीसी में एक बग था, जिसे ठीक किया गया था, या क्या मैं किसी तरह अपरिभाषित व्यवहार का आह्वान कर रहा हूं (और इसलिए संकलक व्यवहार में अंतर एक मूक बिंदु है - यह अपरिभाषित है)?