Questo codice non viene compilato in Clang (6,7,8,9, trunk), ma viene compilato correttamente in GCC (7.1, 8.1, 9.1):
template<class T> struct TypeHolder { using type = T; };
template<int i>
class Outer {
private:
template<class T>
static constexpr auto compute_type() {
if constexpr (i == 42) {
return TypeHolder<bool>{};
} else {
return TypeHolder<T>{};
}
}
public:
template<class T>
using TheType = typename decltype(Outer<i>::compute_type<T>())::type;
};
int main() {
Outer<42>::TheType<int> i;
}
Clang mi dice:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... che ovviamente lo è, ma sto provando ad accedere a quel membro dall'interno della stessa classe. Non vedo perché non dovrebbe essere accessibile lì. Ho colpito (e devo archiviare) un bug di Clang?
Puoi giocare con il codice nell'esploratore del compilatore di Godbolt .
Outer<42>
, non è main
vero? A me sembra ancora più un insetto.
std::result_of
invece funziona?
friend int main();
impedisce a Clang di lamentarsi.