Ce code ne compile pas dans Clang (6,7,8,9, trunk), mais se compile très bien dans 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 me dit:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
… Ce qui est bien sûr le cas, mais j'essaie d'accéder à ce membre depuis l' intérieur de la même classe. Je ne vois pas pourquoi il ne devrait pas y être accessible. Ai-je touché (et dois-je déposer) un bogue Clang?
Vous pouvez jouer avec le code dans l'explorateur de compilateur de Godbolt .
Outer<42>
, non main
- pas vrai? Me ressemblant encore plus à un bug maintenant.
std::result_of
fonctionne à la place?
friend int main();
empêche Clang de se plaindre.