ฉันพยายามเข้าใจตัวอย่างโค้ดต่อไปนี้
ตัวอย่าง # 1
template <typename T>
struct A
{
static constexpr int VB = T::VD;
};
struct B : A<B>
{
};
ไม่ว่าจะเป็น gcc9 หรือ clang9 ข้อผิดพลาดที่นี่
ถามทำไมรหัสนี้ถึงคอมไพล์? เราไม่ได้ยกตัวอย่างA<B>
เมื่อได้รับมรดกจาก B? ไม่มี VD ใน B ดังนั้นคอมไพเลอร์ไม่ควรโยนข้อผิดพลาดที่นี่หรือ
ตัวอย่าง # 2
template <typename T>
struct A
{
static constexpr auto AB = T::AD; // <- No member named AD in B
};
struct B : A<B>
{
static constexpr auto AD = 0xD;
};
ในกรณีนี้ gcc9 คอมไพล์ได้ดี แต่ clang9 ส่งข้อผิดพลาดว่า "ไม่มีสมาชิกชื่อ AD ใน B"
ถามทำไมมันคอมไพล์ด้วย gcc9 / ทำไมมันไม่คอมไพล์ด้วย clang9?
ตัวอย่าง # 3
template <typename T>
struct A
{
using TB = typename T::TD;
};
struct B : A<B>
{
using TD = int;
};
ที่นี่ทั้ง clang9 และ gcc9 มีข้อผิดพลาด gcc9 พูดว่า "การใช้ประเภทที่ไม่สมบูรณ์ 'struct B' ไม่ถูกต้อง"
ถาม: ถ้า struct B ไม่สมบูรณ์ที่นี่แล้วทำไมมันไม่สมบูรณ์ในตัวอย่างที่ 2?
ธงคอมไพเลอร์ที่ใช้: -std=c++17 -O3 -Wall -Werror
. ขอบคุณล่วงหน้า!!!
B
ไม่สมบูรณ์ ... แต่ไม่แน่ใจว่าสมาชิกควรจะสร้างอินสแตนท์เมื่อใด ..
struct B
ตัวอย่างA
กับB
ใช่หรือไม่