Este código não compila no Clang (6,7,8,9, tronco), mas compila perfeitamente no 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 diz:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
… Qual é, é claro, mas estou tentando acessar esse membro de dentro da mesma classe. Não vejo por que não deve ser acessível lá. Eu bati (e devo arquivar) um bug do Clang?
Você pode brincar com o código no explorador de compiladores da Godbolt .
Engraçado! No entanto, a verificação de acesso definitivamente deve ser feita com as "permissões" de
—
Lukas Barth
Outer<42>
, não main
- certo? Parecendo ainda mais um bug para mim agora.
Em
—
Brandon
std::result_of
vez disso, usar o trabalho?
FWIW, também funciona em ICC e MSVC.
—
ChrisMM 23/01
friend int main();
impede Clang de reclamar.