Lớp không thể truy cập phương thức constexpr tĩnh riêng của nó - Lỗi Clang?


28

Mã này không biên dịch trong Clang (6,7,8,9, trung kế), nhưng chỉ biên dịch tốt trong 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;
}

Clang nói với tôi:

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

Tất nhiên là vậy, nhưng tôi đang cố gắng truy cập thành viên đó từ trong cùng một lớp. Tôi không thấy lý do tại sao nó không thể truy cập được ở đó. Tôi đã nhấn (và tôi có nên nộp) một lỗi Clang không?

Bạn có thể chơi đồ chơi với mã tại trình thám hiểm trình biên dịch của Godbolt .


3
Rõ ràng thêm friend int main();ngăn chặn Clang phàn nàn.
HolyBlackCat

2
Buồn cười! Tuy nhiên, kiểm tra truy cập chắc chắn phải được thực hiện với "quyền" Outer<42>, không main- phải không? Bây giờ thậm chí trông giống như một lỗi với tôi.
Lukas Barth

Có sử dụng std::result_ofcông việc thay thế?
Brandon

FWIW, Cũng hoạt động trong ICC và MSVC.
ChrisMM

Câu trả lời:


23

Đây là vấn đề cốt lõi 1554 . Tiêu chuẩn không rõ ràng về cách kiểm tra truy cập được thực hiện cho các mẫu bí danh (trong bối cảnh định nghĩa hoặc trong bối cảnh sử dụng).

Hướng hiện tại là kiểm tra ngữ cảnh của định nghĩa, điều này sẽ làm cho mã của bạn được định dạng tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.