2015-08-15 5 views
14
#include <tuple> 

template<int I> 
struct A {}; 

template<int I, typename... T> 
void f(A<I>, std::tuple<T *...>) {} 

template<typename... T> 
void f(A<0>, std::tuple<T *...>) {} 

int main() 
{ 
    f(A<0>{}, std::tuple<char*, int*, float*>{}); 
} 

f का दूसरा अधिभार अधिक विशिष्ट नहीं है? जी ++ 4.9.2 कहता है कि कॉल संदिग्ध है, clang 3.6.0 इसे स्वीकार करता है। कौन सा कंपाइलर सही है?`void f (ए <0>, tuple <T *...>)` void f (ए <I>, tuple <T *...>) से अधिक विशिष्ट नहीं है?

यह दिलचस्प है कि यदि आप std::tuple<T *...> से std::tuple<T...> बदलते हैं, तो g ++ इसके साथ ठीक है, जिसे मैं समझ नहीं पा रहा हूं।

+0

एमएसवीसी 2013 इस से भी खुश है :) –

+0

मुझे संदेह है कि जीसीसी गलत है, लेकिन मूल्य टेम्पलेट पैरामीटर के बारे में कुछ अस्पष्ट हो सकता है (मानक उनके चारों ओर quirky होने लगता है)। क्या आप मूल्यों का उपयोग किए बिना दोबारा कर सकते हैं? – Yakk

+0

[क्लैंग] (http://clang.llvm.org) कोड के साथ भी ठीक है। –

उत्तर

5

वर्तमान नियमों के अनुसार, दूसरा अधिभार अधिक विशिष्ट है। संश्लेषित मूल्य @ के साथ कुछ विशेषज्ञता A<@>A<0> के विरुद्ध मेल नहीं खाया जा सकता है, लेकिन A<0>A<I> (I=0 के साथ) के साथ मिलान किया जा सकता है। यह पहली जोड़ी असममितता निर्णायक है। चाहे आप T या T* का उपयोग करें क्योंकि दूसरे पैरामीटर में पैटर्न अप्रासंगिक है, क्योंकि कटौती उस जोड़ी के दोनों तरीकों से सफल होती है।

बग अभी भी ट्रंक में बनी हुई है और @ बररी द्वारा 67228 के रूप में रिपोर्ट की गई थी।

+0

नोट: संकल्प सीडब्ल्यूजी 13 9 1 इस संदिग्ध बना सकता है। हालांकि मैं इसके बारे में अनिश्चित हूँ। – Columbo

+0

हाँ संकल्प बिल्कुल सही नहीं है मुझे लगता है। बोगदान का जवाब देखें [यहां] (http://stackoverflow.com/a/31735126/2069064), मुझे लगता है कि उसके पास वाक्यों को हल करने के तरीके के बारे में कुछ अच्छे विचार हैं। – Barry

+3

मैंने सबमिट किया [67228] (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67228)। – Barry

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