มีคำตอบที่สมเหตุสมผลมากมายแล้ว ฉันจะชิปด้วยการเปรียบเทียบที่อาจช่วยให้ผู้อ่านบางคน ::ทำงานได้มากเช่นตัวคั่นไดเรกทอรีระบบแฟ้ม ' /' เมื่อค้นหาเส้นทางของคุณเพื่อหาโปรแกรมที่คุณต้องการเรียกใช้ พิจารณา:
/path/to/executable
สิ่งนี้ชัดเจนมาก - เฉพาะปฏิบัติการที่ตำแหน่งที่แน่นอนในทรีของระบบแฟ้มเท่านั้นที่สามารถจับคู่ข้อมูลจำเพาะนี้ได้โดยไม่คำนึงถึง PATH ที่มีผลบังคับใช้ ในทำนองเดียวกัน ...
::std::cout
... มีความชัดเจนเท่าเทียมกันใน "ต้นไม้" ของ C ++ เนมสเปซ
เมื่อเปรียบเทียบกับพา ธ สัมบูรณ์เช่นนั้นคุณสามารถกำหนดค่าเชลล์ UNIX ที่ดี (เช่นzsh ) เพื่อแก้ไขพา ธสัมพัทธ์ภายใต้ไดเรกทอรีปัจจุบันของคุณหรือองค์ประกอบใด ๆ ในPATHตัวแปรสภาพแวดล้อมของคุณดังนั้นหากPATH=/usr/bin:/usr/local/binและคุณอยู่ "ใน" /tmpแล้ว ...
X11/xterm
... จะทำงานอย่างมีความสุข/tmp/X11/xtermหากพบอื่นอื่น/usr/bin/X11/xterm /usr/local/bin/X11/xtermในทำนองเดียวกันสมมติว่าคุณอยู่ในเนมสเปซที่เรียกว่าXและมีusing namespace Yผลบังคับใช้" " แล้ว ...
std::cout
... อาจจะพบในใด ๆ ของ::X::std::cout, ::std::cout, ::Y::std::coutและสถานที่อื่น ๆ อาจจะเนื่องมาจากการค้นหาโต้แย้งขึ้นอยู่กับ (ADL อาคานิกการค้นหา) ดังนั้นเพียง::std::coutเป็นจริงอย่างชัดเจนเกี่ยวกับว่าที่คุณหมายถึงวัตถุ แต่ไม่มีใครโชคดีที่ในใจขวาของพวกเขาเคยจะสร้างชั้นของตัวเอง / struct หรือ namespace ที่เรียกว่า " std" หรือสิ่งใด ๆ ที่เรียกว่า " cout" ดังนั้นในทางปฏิบัติโดยใช้เพียงstd::coutเป็นเรื่องปกติ
ความแตกต่างที่น่าสังเกต :
1) เชลล์มีแนวโน้มที่จะใช้คู่แรกโดยใช้การสั่งซื้อในPATHขณะที่ C ++ ให้ข้อผิดพลาดคอมไพเลอร์เมื่อคุณไม่ชัดเจน
2) ใน C ++ ชื่อโดยไม่ต้องขอบเขตชั้นนำใด ๆ สามารถจับคู่ใน namespace ปัจจุบันขณะที่ส่วนใหญ่เปลือกหอยยูนิกซ์เท่านั้นทำว่าถ้าคุณใส่ใน.PATH
3) C ++ จะค้นหาเนมสเปซส่วนกลาง (เช่นมี/ของคุณโดยปริยายPATH)
การสนทนาทั่วไปเกี่ยวกับ namespaces และชัดเจนของสัญลักษณ์
::abc::def::...บางครั้งการใช้"เส้นทาง" แบบสัมบูรณ์อาจมีประโยชน์ในการแยกคุณออกจากเนมสเปซอื่น ๆ ที่คุณใช้ส่วนหนึ่งของ แต่ไม่สามารถควบคุมเนื้อหาของหรือแม้แต่ไลบรารีอื่น ๆ ที่รหัสลูกค้าของห้องสมุดของคุณใช้ ในทางกลับกันมันจะทำให้คุณจับคู่กับตำแหน่งสัญลักษณ์ "สัมบูรณ์" ที่มีอยู่อย่างแน่นแฟ้นยิ่งขึ้นและคุณพลาดข้อดีของการจับคู่โดยนัยในเนมสเปซ: การมีเพศสัมพันธ์น้อยลง .
เช่นเดียวกับหลาย ๆ สิ่งมันเป็นการกระทำที่สมดุล c ++ มาตรฐานทำให้จำนวนมากของตัวระบุภายใต้std::ที่น้อย "พิเศษ" กว่าcoutที่โปรแกรมเมอร์อาจใช้สำหรับบางสิ่งบางอย่างที่แตกต่างกันอย่างสมบูรณ์ในรหัสของพวกเขา (เช่นmerge, includes, fill, generate, exchange, queue, toupper, max) สองไลบรารีที่ไม่เกี่ยวข้องที่ไม่ได้มาตรฐานนั้นมีโอกาสสูงกว่าที่จะใช้ตัวระบุเดียวกันกับผู้เขียนโดยทั่วไปแล้วจะไม่ได้ตระหนักถึงหรือน้อยกว่ากัน และไลบรารี - รวมถึงไลบรารีมาตรฐาน C ++ - เปลี่ยนสัญลักษณ์ของพวกเขาเมื่อเวลาผ่านไป ทั้งหมดนี้อาจสร้างความกำกวมเมื่อทำการคอมไพล์โค้ดเก่าโดยเฉพาะเมื่อมีการใช้งานจำนวนมากusing namespaces: สิ่งที่แย่ที่สุดที่คุณสามารถทำได้ในพื้นที่นี้คืออนุญาตusing namespaceในส่วนหัวเพื่อหลีกเลี่ยงขอบเขตของส่วนหัวเช่นว่ารหัสลูกค้าจำนวนมากทั้งทางตรงและทางอ้อมไม่สามารถตัดสินใจได้เองว่าควรใช้ namespaces ใดและวิธีการจัดการความคลุมเครือ
ดังนั้นสิ่งที่สำคัญที่สุด::คือเครื่องมือหนึ่งในกล่องเครื่องมือของโปรแกรมเมอร์ C + + ที่จะลดความขัดแย้งที่รู้จักกันอย่างแข็งขันและ / หรือกำจัดความเป็นไปได้ของความคลุมเครือในอนาคต ....
::หมายถึงการอ้างอิงตัวแปรจาก namespace ส่วนกลาง / ไม่ระบุชื่อ