2015-08-15 27 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 ikinci aşırı yükü daha fazla uzman değil mi? g ++ 4.9.2, çağrının belirsiz olduğunu söyler, argo 3.6.0 bunu kabul eder. Hangi derleyici doğru?`void f (A <I>, tuple <T *...>)` dan daha özel değil (A <0>, tuple <T *...>) `` dır?

std::tuple<T *...>'u std::tuple<T...> olarak değiştirirseniz, g ++ bununla iyi anlaşılamıyor, ki bu anlamadım.

+0

MSVC 2013 de bununla mutlu :) –

+0

Gcc'nin yanlış olduğunu düşündüğümden şüpheliyim, ama değer şablon parametreleriyle ilgili bir şey belirsiz olabilir (standart, etrafta ilginç olma eğilimindedir). Değer kullanmadan repo alabilir misin? – Yakk

+0

[clang] (http://clang.llvm.org) da kod ile tamam. Türleri kullanarak –

cevap

5

Mevcut kurallara göre, ikinci aşırı yük daha uzman. @ sentezlenmiş değeri olan A<@> numaralı bazı uzmanlıklar, A<0> ile eşleştirilemez, ancak A<0>, A<I> (I=0 ile) ile eşleştirilebilir. Bu ilk çiftin asimetrisi belirleyicidir. T veya T* modelini, ikinci parametrede kalıbın alakasız olması durumunda, kesinti bu çift için her iki yolu başarılı bir şekilde kullanır.

Hata hala gövdede devam ediyor ve @Barry tarafından 67228 olarak bildirildi.

+0

Not: CWG 1391 çözünürlüğü bunu belirsiz hale getirebilir. Bundan emin değilim. – Columbo

+0

Evet, çözümün doğru olmadığını düşünüyorum. Bogdan'ın cevabını kontrol edin (burada) (http://stackoverflow.com/a/31735126/2069064), bence sözcüklerin nasıl çözüleceğine dair iyi fikirleri var. – Barry

+3

[67228] gönderdim (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=67228). – Barry

İlgili konular