2017-12-18 439 views
9

Niedawno miałem problem z kodu:Dlaczego kompilator nie może wydedukować parametru automatycznego szablonu, chyba że dodaję const?

constexpr auto lambda = []{}; 

template<auto& l> 
struct Lambda {}; 

template<auto& l> 
void test(Lambda<l>) {} 

int main() { 
    test(Lambda<lambda>{}); 
} 

Zarówno szczęk i GCC mówi, że nie można wywnioskować l.

Jednakże, jeśli dodam const tam:

// ----v 
template<const auto& l> 
void test(Lambda<l>) {} 

Potem wszystko działa z brzękiem. GCC wciąż nie działa. Co tu się dzieje? Czy to nie może wydedukować samego siebie? Czy jest to błąd GCC, aby nie wyprowadzać w obu przypadkach l?

Odpowiedz

8

Czy jest to błąd GCC, aby nie wydedukować lw obu przypadkach?

Jest to błąd, a dla Clang też. Dla typu zastępczy non typu argumentu [temp.arg.nontype]/1 mówi:

Jeśli typ Template-parametru zawiera typ zastępczy, wywnioskować typ parametru określa się na podstawie typu szablonu-argumentu przez zastępczy typ odliczenia. Jeśli wydedukowany typ parametru jest niedozwolony w przypadku deklaracji parametru szablonu ([temp.param]), program jest źle sformułowany.

Ten sam proces, w którym byłoby wywnioskować tutaj

int main() { 
    auto& l = lambda; 
} 

To l jest const odniesienia.