หมายเหตุ: คำถามนี้เป็นเรื่องเกี่ยวกับที่ไม่ได้name space
namespace
มาตรฐาน C ++ มีการอ้างอิงบางอย่างname space
แต่ฉันไม่เห็นคำจำกัดความของสิ่งนี้ มาตรฐานบอกว่าฉลากและมาโครอยู่ในพื้นที่ชื่อที่แตกต่างกัน การอ้างอิงอื่น ๆ ทั้งหมดที่name space
อยู่ในส่วนความเข้ากันได้ของ C / C ++ เช่นนี้ ( ฉบับร่างปัจจุบัน ):
นี่เป็นหนึ่งในความไม่ลงรอยกันระหว่าง C และ C ++ ที่สามารถนำมาประกอบกับคำจำกัดความพื้นที่ชื่อ C ++ ใหม่ซึ่งสามารถประกาศชื่อเป็นชนิดและเป็นชนิดที่ไม่ใช่ชนิดในขอบเขตเดียวทำให้ชื่อที่ไม่ใช่ประเภทซ่อน ชื่อประเภทและกำหนดให้ใช้คำหลักคลาสโครงสร้างยูเนี่ยนหรือ enum เพื่ออ้างถึงชื่อประเภท การกำหนดพื้นที่ชื่อใหม่นี้ให้ความสะดวกสบายที่สำคัญแก่โปรแกรมเมอร์ 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
[cpp]/8