ชั้นไม่สามารถเข้าถึงวิธี constexpr คงที่ส่วนตัวของตัวเอง - ข้อผิดพลาดดังกราว?


28

รหัสนี้ไม่ได้รวบรวมใน Clang (6,7,8,9 ลำตัว) แต่รวบรวมได้ใน 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;
}

เสียงดังกราวด์บอกฉัน:

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

... แน่นอนว่ามันคืออะไร แต่ฉันพยายามเข้าถึงสมาชิกคนนั้นจากในชั้นเรียนเดียวกัน ฉันไม่เห็นสาเหตุที่ไม่สามารถเข้าถึงได้ ฉันได้กดปุ่ม (และฉันควรจะ) บั๊กเสียงดังกราว

คุณสามารถของเล่นรอบกับรหัสที่Godbolt ของคอมไพเลอร์สำรวจ


3
เห็นได้ชัดว่าการเพิ่มfriend int main();หยุดเสียงดังกราวจากการบ่น
HolyBlackCat

2
ตลก! อย่างไรก็ตามการตรวจสอบการเข้าถึงควรจะทำด้วย "สิทธิ์" ของOuter<42>ไม่ใช่mainไหม? กำลังมองหาข้อบกพร่องมากขึ้นสำหรับฉันตอนนี้
Lukas Barth

ใช้std::result_ofงานแทนหรือไม่
แบรนดอน

FWIW ทำงานใน ICC และ MSVC ด้วย
ChrisMM

คำตอบ:


23

นี่คือปัญหาหลัก 1554 มาตรฐานไม่ชัดเจนว่าจะทำการตรวจสอบการเข้าถึงสำหรับแม่แบบนามแฝงอย่างไร (ในบริบทของคำจำกัดความหรือในบริบทของการใช้งาน)

ทิศทางปัจจุบันคือการตรวจสอบในบริบทของคำนิยามซึ่งจะทำให้โค้ดของคุณมีรูปแบบที่ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.