พิจารณาไฟล์ส่วนหัว:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept : ID(ID_) {}
int GetID() const noexcept { return ID; }
};
หรืออีกทางหนึ่ง:
class T
{
private:
int const ID;
public:
explicit T(int const ID_) noexcept;
int GetID() const noexcept;
};
inline T::T(int const ID_) noexcept : ID(ID_) {}
inline int T::GetID() const noexcept { return ID; }
ในโลกก่อนโมดูลส่วนหัวเหล่านี้อาจรวมอยู่ใน textually ใน TU หลายรายการโดยไม่มีการละเมิด ODR นอกจากนี้เนื่องจากการทำงานของสมาชิกที่เกี่ยวข้องกับการมีขนาดค่อนข้างเล็กคอมไพเลอร์น่าจะ "อินไลน์" (ฟังก์ชั่นหลีกเลี่ยงการโทรเมื่อใช้) ฟังก์ชั่นเหล่านั้นหรือแม้กระทั่งการเพิ่มประสิทธิภาพออกไปบางส่วนกรณีของT
ทั้งหมด
ในรายงานล่าสุดเกี่ยวกับการประชุมที่ C ++ 20 เสร็จสิ้นฉันสามารถอ่านข้อความต่อไปนี้:
เราชี้แจงความหมายของ
inline
ในอินเทอร์เฟซโมดูล: เจตนาคือเนื้อความของฟังก์ชันที่ไม่ได้ประกาศไว้อย่างชัดเจนinline
ไม่ได้เป็นส่วนหนึ่งของ ABI ของโมดูลแม้ว่าฟังก์ชันของฟังก์ชันเหล่านั้นจะปรากฏในส่วนต่อประสานโมดูล เพื่อที่จะให้ผู้เขียนโมดูลการควบคุมที่มากกว่า ABIinline
ของพวกเขาฟังก์ชั่นสมาชิกที่กำหนดไว้ในร่างกายในระดับอินเตอร์เฟซโมดูลนี้ไม่มีอีกต่อไปโดยปริยาย
ฉันไม่แน่ใจว่าฉันไม่ผิด นั่นหมายความว่าในโลกของโมดูลเพื่อให้คอมไพเลอร์สามารถเพิ่มประสิทธิภาพการเรียกใช้ฟังก์ชันเราต้องใส่คำอธิบายประกอบราวกับinline
ว่ามันถูกกำหนดไว้ในคลาส?
ถ้าเป็นเช่นนั้นส่วนต่อไปนี้ของโมดูลจะเทียบเท่ากับส่วนหัวด้านบนหรือไม่
export module M;
export
class T
{
private:
int const ID;
public:
inline explicit T(int const ID_) noexcept : ID(ID_) {}
inline int GetID() const noexcept { return ID; }
};
แม้ว่าฉันจะยังไม่มีคอมไพเลอร์ที่สนับสนุนโมดูล แต่ฉันต้องการเริ่มใช้inline
เช่นนั้นเมื่อเหมาะสมเพื่อลดการปรับโครงสร้างในอนาคต
inline
คีย์เวิร์ดจะไม่มีการคอมไพล์โดย inline ใช่ไหม?