Klasse kann nicht auf ihre eigene private statische Constexpr-Methode zugreifen - Clang-Fehler?

28

Dieser Code wird nicht in Clang (6,7,8,9, Trunk) kompiliert, sondern in GCC (7.1, 8.1, 9.1) einwandfrei kompiliert:

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 sagt mir:

<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'

... was natürlich ist es, aber ich versuche den Zugriff auf das Mitglied von innen der gleichen Klasse. Ich verstehe nicht, warum es dort nicht zugänglich sein sollte. Habe ich einen Clang-Fehler gefunden (und sollte ich ihn einreichen)?

Sie können mit dem Code im Compiler-Explorer von Godbolt herumspielen .

Lukas Barth
quelle
3
Anscheinend friend int main();hindert das Hinzufügen Clang daran, sich zu beschweren.
HolyBlackCat
2
Komisch! Die Zugriffsprüfung sollte jedoch auf jeden Fall mit den "Berechtigungen" von erfolgen Outer<42>, nicht main- richtig? Sieht für mich jetzt noch mehr nach einem Käfer aus.
Lukas Barth
Funktioniert std::result_ofstattdessen?
Brandon
FWIW, funktioniert auch in ICC und MSVC.
ChrisMM

Antworten:

23

Dies ist das Kernproblem 1554 . Der Standard ist unklar, wie die Zugriffsprüfung für Alias-Vorlagen durchgeführt wird (im Kontext der Definition oder im Kontext der Verwendung).

Die aktuelle Richtung besteht darin, den Kontext der Definition zu überprüfen, wodurch Ihr Code wohlgeformt wird.

TC
quelle