La classe non può accedere al proprio metodo constexpr statico privato - Clang bug?


28

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 .


3
Apparentemente l'aggiunta friend int main();impedisce a Clang di lamentarsi.
HolyBlackCat

2
Divertente! Tuttavia, il controllo degli accessi dovrebbe assolutamente essere effettuato con le "autorizzazioni" di Outer<42>, non è mainvero? A me sembra ancora più un insetto.
Lukas Barth,

Usare std::result_ofinvece funziona?
Brandon,

FWIW, funziona anche in ICC e MSVC.
ChrisMM,

Risposte:


23

Questo è il problema principale 1554 . Lo standard non è chiaro in che modo viene eseguito il controllo dell'accesso per i modelli di alias (nel contesto della definizione o nel contesto dell'uso).

La direzione attuale è quella di verificare nel contesto della definizione, che renderebbe il tuo codice ben formato.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.