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 .
c++
language-lawyer
c++17
clang++
Lukas Barth
quelle
quelle
friend int main();
hindert das Hinzufügen Clang daran, sich zu beschweren.Outer<42>
, nichtmain
- richtig? Sieht für mich jetzt noch mehr nach einem Käfer aus.std::result_of
stattdessen?Antworten:
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.
quelle