หมายเหตุ: คำถามนี้เกี่ยวกับ name space
ไม่ใช่ namespace
มาตรฐาน C++ มีการอ้างอิงถึง name space
แต่ฉันไม่เห็นคำจำกัดความของสิ่งนี้ มาตรฐานระบุว่าป้ายกำกับและมาโครอยู่ในช่องว่างชื่อที่แตกต่างกัน การอ้างอิงอื่นๆ ทั้งหมดถึง name space
อยู่ในส่วนความเข้ากันได้ของ C/C++ เช่นนี้ (current ฉบับร่าง):
นี่เป็นหนึ่งในความไม่เข้ากันไม่กี่อย่างระหว่าง C และ C++ ที่สามารถนำมาประกอบกับ คำจำกัดความของพื้นที่ชื่อ C++ ใหม่ โดยที่ชื่อสามารถประกาศเป็นประเภทและไม่ใช่ประเภทในขอบเขตเดียวที่ทำให้เกิด ชื่อที่ไม่ใช่ประเภทเพื่อซ่อนชื่อประเภทและกำหนดให้ใช้คลาสคีย์เวิร์ด โครงสร้าง ยูเนี่ยน หรือแจงนับเพื่ออ้างอิงถึงชื่อประเภท คำจำกัดความของเนมสเปซใหม่นี้ มอบความสะดวกด้านสัญลักษณ์ที่สำคัญให้กับโปรแกรมเมอร์ C++ และช่วยให้การใช้ประเภทที่ผู้ใช้กำหนดมีความคล้ายคลึงกับการใช้ประเภทพื้นฐานมากที่สุด
คำจำกัดความของพื้นที่ชื่อใหม่นี้คืออะไร ฉันจะหามันได้ในมาตรฐานที่ไหน? กฎที่แน่นอนคืออะไร? กฎดูเหมือนจะซับซ้อนกว่า "ประเภทการซ่อนที่ไม่ใช่ประเภท" เช่นนี้ไม่ได้รวบรวม:
typedef int Foo; // Foo is a type
void Foo(); // not a type, but compile error, instead of hiding
แต่สิ่งนี้ทำ:
struct Foo { }; // Foo is a type as well
void Foo(); // This hides the type Foo. "struct Foo" refers to the type
และนี่ก็ไม่ได้คอมไพล์เช่นกัน:
struct Foo { }; // Type
namespace Foo { } // Non-type, but compiler error instead of hiding
[stmt.label]/1
และอีกช่องสำหรับมาโคร < a href="https://eel.is/c++draft/cpp#replace-8" rel="nofollow noreferrer">[cpp]/8
. - person YSC   schedule 17.03.2020[class.name]/2
. - person YSC   schedule 17.03.2020