#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 ++ इसके साथ ठीक है, जिसे मैं समझ नहीं पा रहा हूं।
एमएसवीसी 2013 इस से भी खुश है :) –
मुझे संदेह है कि जीसीसी गलत है, लेकिन मूल्य टेम्पलेट पैरामीटर के बारे में कुछ अस्पष्ट हो सकता है (मानक उनके चारों ओर quirky होने लगता है)। क्या आप मूल्यों का उपयोग किए बिना दोबारा कर सकते हैं? – Yakk
[क्लैंग] (http://clang.llvm.org) कोड के साथ भी ठीक है। –