A classe não pode acessar seu próprio método constexpr estático privado - Clang bug?


28

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 .


3
Aparentemente, a adição friend int main();impede Clang de reclamar.
HolyBlackCat 23/01

2
Engraçado! No entanto, a verificação de acesso definitivamente deve ser feita com as "permissões" de Outer<42>, não main- certo? Parecendo ainda mais um bug para mim agora.
Lukas Barth

Em std::result_ofvez disso, usar o trabalho?
Brandon

FWIW, também funciona em ICC e MSVC.
ChrisMM 23/01

Respostas:


23

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.