Sınıf kendi özel statik constexpr yöntemine erişemiyor - Clang bug?


28

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 .


3
Görünüşe göre friend int main();Clang şikayet etmeyi durdurur.
HolyBlackCat

2
Komik! Ancak, erişim kontrolü kesinlikle "izinleri" ile yapılmalıdır Outer<42>, değil mainmi? Şimdi bana daha çok bir böcek gibi bakıyor.
Lukas Barth

std::result_ofBunun yerine kullanmak işe yarıyor mu?
Brandon

FWIW, ICC ve MSVC'de de çalışır.
ChrisMM

Yanıtlar:


23

Bu temel sorun 1554 . Standart, takma şablonlar için erişim tanımlamasının nasıl gerçekleştirildiği konusunda net değildir (tanım bağlamında veya kullanım bağlamında).

Geçerli yön, kodunuzun iyi biçimlendirilmesini sağlayacak tanım bağlamında kontrol etmektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.