2012-04-30 33 views
6

पर विचार करें निम्नलिखित कार्यक्रम:क्या पैक खाली होने पर प्रतिस्थापन पैरामीटर पैक प्रकार पर किया गया प्रतिस्थापन है?

#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{}>() लिखता हूं तो यह प्रोग्राम स्वीकार करता है।

ऐसा लगता है कि पैक खाली होने पर पैरामीटर पैक के प्रकार पर विचार नहीं करता है, जिससे उम्मीदवार सेट से इसे हटाया नहीं जाता है। जीसीसी पैरामीटर पैक प्रकार पर प्रतिस्थापन करने लगता है भले ही पैक खाली हो, और चूंकि कहा गया प्रतिस्थापन एक अधिभार के लिए विफल रहता है, वहां कोई अस्पष्टता नहीं है।

इनमें से कौन सा सही है?

उत्तर

7

मुझे विश्वास है कि मुझे मानक के प्रासंगिक टुकड़े मिल गए हैं। §14.8.2p7 कहता है:

प्रतिस्थापन फ़ंक्शन प्रकार और टेम्पलेट पैरामीटर घोषणाओं में उपयोग किए जाने वाले सभी प्रकारों और अभिव्यक्तियों में होता है।

EnableIf<dependent_true_type<T>> के बाद से टेम्पलेट पैरामीटर घोषणा में प्रयोग किया जाता है, प्रतिस्थापन होने चाहिए और इस a bug in clang है।

+0

क्या आप पीआर पर टिप्पणी कर सकते हैं और अपना टेस्टकेस जोड़ सकते हैं? आपका टेस्टकेस अधिक महत्वपूर्ण imho है, क्योंकि यह तर्क कटौती के दौरान होता है (मेरा टेस्टकेस केवल तर्क कटौती के बाद अंत में एक प्रतिस्थापन को याद करता है) और क्योंकि क्लैंग जीसीसी से भिन्न होता है। –

+0

@ जोहान्स हो गया। –

+0

धन्यवाद दोस्त। । –

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^