पर विचार करें निम्नलिखित कार्यक्रम:क्या पैक खाली होने पर प्रतिस्थापन पैरामीटर पैक प्रकार पर किया गया प्रतिस्थापन है?
#include <type_traits>
enum class dummy {};
template <typename T>
using EnableIf = typename std::enable_if<T::value, dummy>::type;
template <typename T>
using DisableIf = typename std::enable_if<!T::value, dummy>::type;
template <typename T>
struct dependent_true_type : std::true_type {};
template <typename T,
EnableIf<dependent_true_type<T>>...>
std::true_type f();
template <typename T,
DisableIf<dependent_true_type<T>>...>
std::false_type f();
static_assert(decltype(f<int>())::value, "");
int main() {}
जीसीसी 4.7 glady इस कार्यक्रम स्वीकार करता है। मेरे हालिया क्लैंग 3.1 बिल्ड का दावा है कि f
पर कॉल संदिग्ध है।
test.c++:22:24: fatal error: call to 'f' is ambiguous
static_assert(decltype(f<int>())::value, "");
^~~~~~
test.c++:17:16: note: candidate function [with T = int, $1 = <>]
std::true_type f();
^
test.c++:20:17: note: candidate function [with T = int, $1 = <>]
std::false_type f();
^
1 error generated.
यदि मैं f<int, dummy{}>()
लिखता हूं तो यह प्रोग्राम स्वीकार करता है।
ऐसा लगता है कि पैक खाली होने पर पैरामीटर पैक के प्रकार पर विचार नहीं करता है, जिससे उम्मीदवार सेट से इसे हटाया नहीं जाता है। जीसीसी पैरामीटर पैक प्रकार पर प्रतिस्थापन करने लगता है भले ही पैक खाली हो, और चूंकि कहा गया प्रतिस्थापन एक अधिभार के लिए विफल रहता है, वहां कोई अस्पष्टता नहीं है।
इनमें से कौन सा सही है?
क्या आप पीआर पर टिप्पणी कर सकते हैं और अपना टेस्टकेस जोड़ सकते हैं? आपका टेस्टकेस अधिक महत्वपूर्ण imho है, क्योंकि यह तर्क कटौती के दौरान होता है (मेरा टेस्टकेस केवल तर्क कटौती के बाद अंत में एक प्रतिस्थापन को याद करता है) और क्योंकि क्लैंग जीसीसी से भिन्न होता है। –
@ जोहान्स हो गया। –
धन्यवाद दोस्त। । –