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 .
c++
language-lawyer
c++17
clang++
Lukas Barth
fonte
fonte
friend int main();
impede Clang de reclamar.Outer<42>
, nãomain
- certo? Parecendo ainda mais um bug para mim agora.std::result_of
vez disso, usar o trabalho?Respostas:
Esta é a questão principal 1554 . O padrão não está claro como a verificação de acesso é executada para modelos de alias (no contexto de definição ou no contexto de uso).
A direção atual é verificar o contexto da definição, o que tornaria seu código bem formado.
fonte