Kelas tidak dapat mengakses metode constexpr statis pribadi sendiri - Dentang bug?

28

Kode ini tidak dikompilasi di Dentang (6,7,8,9, trunk), tetapi kompilasi saja di GCC (7.1, 8.1, 9.1):

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;
}

Dentang memberitahu saya:

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

... yang tentu saja itu, tapi aku mencoba mengakses anggota itu dari dalam kelas yang sama. Saya tidak mengerti mengapa itu tidak dapat diakses di sana. Sudahkah saya menekan (dan haruskah saya mengajukan) bug Dentang?

Anda dapat bermain-main dengan kode di explorer compiler Godbolt .

Lukas Barth
sumber
3
Rupanya menambahkan friend int main();berhenti Dentang mengeluh.
HolyBlackCat
2
Lucu! Namun, pemeriksaan akses harus dilakukan dengan "izin" dari Outer<42>, bukan main- bukan? Terlihat lebih seperti bug bagiku sekarang.
Lukas Barth
Apakah menggunakan std::result_ofpekerjaan saja?
Brandon
FWIW, Juga bekerja di ICC dan MSVC.
ChrisMM

Jawaban:

23

Ini adalah masalah inti 1554 . Standar tidak jelas bagaimana pemeriksaan akses dilakukan untuk templat alias (dalam konteks definisi, atau dalam konteks penggunaan).

Arah saat ini adalah untuk memeriksa dalam konteks definisi, yang akan membuat kode Anda terbentuk dengan baik.

TC
sumber