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 .
Outer<42>
, nicht main
- richtig? Sieht für mich jetzt noch mehr nach einem Käfer aus.
std::result_of
stattdessen?
friend int main();
hindert das Hinzufügen Clang daran, sich zu beschweren.