2014-07-12 15 views
6

clang 3.4 aşağıdaki kodu kabul eder; vc ise ++ Kasım 2013 CTP bir hata ile reddeder: C++ 14 standardına göre doğru derleyiciKod neden clang tarafından kabul edildi, ancak vC++ tarafından reddedildi mi?

error C2668: 'AreEqual' : ambiguous call to overloaded function 
template<class headT, class... tailTypes> 
constexpr headT&& __GetFirst__(headT&& value, tailTypes&&...) 
{ 
    return static_cast<headT&&>(value); 
}; 

template<class T> 
constexpr bool AreEqual(const T& a, const T& b) 
{ 
    return a == b; 
} 

template<class headT, class... tailTypes> 
constexpr bool AreEqual(const headT& head_value, const tailTypes&... tail_values) 
{ 
    return AreEqual(head_value, __GetFirst__(tail_values...)) 
      && AreEqual(tail_values...); 
} 

int main() 
{ 
    AreEqual(1, 1, 2, 1); 
} 

?

Güncelleme: Tam hata iletisi:

error C2668: 'AreEqual' : ambiguous call to overloaded function 
1>   d:\projects\ktl\test\main.cpp(20): could be 'bool AreEqual<headT,int>(const headT &,const int &)' 
1>   with 
1>   [ 
1>    headT=int 
1>   ] 
1>   d:\projects\ktl\test\main.cpp(8): or  'bool AreEqual<headT>(const T &,const T &)' 
1>   with 
1>   [ 
1>    headT=int 
1> ,   T=int 
1>   ] 
1>   while trying to match the argument list '(const int, const int)' 
1> 
1>Build FAILED. 
+4

Yan notu : '__GetFirst__' ayrılmış bir addır. –

+0

Tüm hata mesajını lütfen gönderir misiniz? –

+0

hangisinin doğru olduğunu bilmiyoruz, fakat kolay düzeltme, variadic 3 + params – sp2danny

cevap

8

Clang (ve GCC) 'nin davranış doğrudur. Sen fonksiyon şablonları için kısmi sıralama nasıl yapılır için standardın [temp.deduct.partial] §14.8.2.4 okuyabilir, ama bu fırkasının p8 verilen örnek doğrudan bu durumu kapsamaktadır:

template<class... Args> void f(Args... args); // #1 
template<class T1, class... Args> void f(T1 a1, Args... args); // #2 
template<class T1, class T2> void f(T1 a1, T2 a2); // #3 
f(); // calls #1 
f(1, 2, 3); // calls #2 
f(1, 2); // calls #3; non-variadic template #3 is more 
     // specialized than the variadic templates #1 and #2 
+2

+1. Ayrıca, standardın farklı sürümlerinde bulmayı daha kolay hale getirmek için bu alt madde için '[bracked subsection] tanımlayıcısını ekledik. (Spesifik madde #s hareket eder ama bu tanımlayıcılar sabittir) –

+2

@BillyONeal Bu tanımlayıcıları sabitlemekten ('basic.lookup.koenig'->' basic.lookup.argdep' :)) emin olmak isterim. –

+0

T.C. lol - iyi, nispeten herhangi bir oranda sabit –