Bu kod Clang'da (6,7,8,9, gövde) derlenmez, ancak GCC'de (7.1, 8.1, 9.1) iyi derlenir:
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 bana şunu söylüyor:
<source>:17:49: error: 'compute_type' is a private member of 'Outer<42>'
... tabii ki, ama erişmek için bu üyeyi çalışıyorum hangi içeride aynı sınıfta. Orada neden erişilebilir olmaması gerektiğini anlamıyorum. Bir Clang hatasını vurdum (ve dosyalamalıyım)?
Godbolt'un derleyici kaşifindeki kodla oyun oynayabilirsiniz .
Komik! Ancak, erişim kontrolü kesinlikle "izinleri" ile yapılmalıdır
—
Lukas Barth
Outer<42>
, değil main
mi? Şimdi bana daha çok bir böcek gibi bakıyor.
std::result_of
Bunun yerine kullanmak işe yarıyor mu?
FWIW, ICC ve MSVC'de de çalışır.
—
ChrisMM
friend int main();
Clang şikayet etmeyi durdurur.