บริบทของการอ้างอิงถูกกำหนดอย่างไร

ฉันกำลังพยายามเข้าใจกฎของส่วน 3.4.3.2/3 ของ N3797 c++14 ร่างการทำงานขั้นสุดท้าย:

กำหนดให้ X::m (โดยที่ X คือเนมสเปซที่ผู้ใช้ประกาศ) หรือกำหนด ::m (โดยที่ X คือเนมสเปซโกลบอล) หาก S(X, m) เป็นเซตว่าง โปรแกรมจะมีรูปแบบไม่ถูกต้อง มิฉะนั้น ถ้า S(X, m) มีสมาชิกเพียงตัวเดียว หรือถ้าบริบทของการอ้างอิงคือการใช้การประกาศ (7.3.3) S(X, m) ก็คือชุดการประกาศของ m ที่จำเป็น มิฉะนั้น ถ้าการใช้ m ไม่ใช่สิ่งที่ยอมให้มีการเลือกการประกาศเฉพาะจาก S(X, m) โปรแกรมจะมีรูปแบบไม่ถูกต้อง

ฉันได้เขียนโค้ดต่อไปนี้:

inline namespace A
{
    int i = 42;
};

namespace B 
{
    static const int i = 5;
};

using B::i;

int g= ::i //S(X, i)={using B::i, A::i}

int main() { }

ดังที่กล่าวไว้ในคำพูดที่อ้างถึงข้างต้นเรามี:

[...]ถ้า S(X, m) เป็นเซตว่าง[...]

S(X,m) ไม่ว่างเปล่า เพิ่มเติม:

มิฉะนั้น ถ้า S(X, m) มีสมาชิกเพียงตัวเดียว

ไม่เป็นความจริง เพิ่มเติมว่า

หรือถ้าบริบทของการอ้างอิงเป็นการประกาศการใช้

ฉันไม่เข้าใจว่าข้อจำกัดนั้นตรวจสอบตัวอย่างของฉันได้อย่างไร ฉันต้องการเข้าใจว่าบริบทของการอ้างอิงถูกกำหนดอย่างไรขึ้นอยู่กับการใช้ข้อมูลอ้างอิงนั้น


person Community    schedule 20.06.2014    source แหล่งที่มา
comment
ข้อ 3.4.3.2/3 ของเอกสารใด ฉันเดาได้ แต่ต้องใช้เวลาพอสมควรเพื่อยืนยัน   -  person Sebastian Mach    schedule 20.06.2014
comment
@phresnel ขอบคุณสำหรับความคิดเห็นของคุณ ฉันได้แก้ไขคำถามของฉันแล้ว   -  person    schedule 20.06.2014


คำตอบ (1)


ต่อไปนี้เป็นเนื้อหาที่เรียบง่ายแม้ว่าจะเขียนในลักษณะที่น่าสับสนก็ตาม ชื่ออาจเป็นสมาชิกของเนมสเปซหรือเนมสเปซแบบอินไลน์ หรือชื่อนั้นเป็นชื่อที่แนะนำโดยการใช้คำสั่งของเนมสเปซอื่น ถ้าชื่อนั้นเป็นชื่อเดียวก็จะถูกนำมาใช้

ในตัวอย่างโค้ดของคุณ S( global, i ) มีสมาชิกสองคนซึ่งตัวหนึ่งถูกกำหนดไว้ในเนมสเปซแบบอินไลน์ A และอีกตัวถูกนำมาใช้โดยใช้การประกาศ ดังนั้นจึงมีความคลุมเครือ

ดังนั้นลำดับการพิจารณาเนมสเปซจึงมีดังต่อไปนี้ ในตอนแรกจะถือว่าเนมสเปซนั้นและเนมสเปซที่อยู่ภายในนั้น ถ้าเป็นชื่อเดียวกันก็จะถูกใช้

มิฉะนั้นคอมไพเลอร์จะพิจารณาใช้คำสั่ง หากชื่อนั้นตรงกับชื่อที่ใช้อีกครั้ง

ในกรณีอื่นๆ ทั้งหมด โปรแกรมมีรูปแบบไม่ถูกต้อง

คุณต้องพิจารณาย่อหน้าก่อนหน้าของมาตรฐาน

2 สำหรับเนมสเปซ X และชื่อ m ชุดการค้นหาที่ผ่านการรับรองเนมสเปซ S(X,m) ถูกกำหนดไว้ดังนี้: ให้ S0(X,m) เป็นชุดของการประกาศทั้งหมดของ m ใน X และชุดเนมสเปซแบบอินไลน์ของ X (7.3.1) ถ้า S0(X,m) ไม่ว่างเปล่า S(X,m) จะเป็น S0(X,m); มิฉะนั้น S(X,m) จะเป็นการรวมกันของ S(Ni,m) สำหรับเนมสเปซทั้งหมด Ni ที่ได้รับการเสนอชื่อโดยใช้คำสั่งใน X และชุดเนมสเปซแบบอินไลน์

แก้ไข: ฉันขอโทษ. ฉันผสมโดยใช้การประกาศและใช้คำสั่ง ในตัวอย่างของคุณมีการประกาศการใช้ ดังนั้นชื่อจึงไม่ชัดเจน ไอดีแทน

using B::i;

จะมี

using namespace B;

แล้วจะไม่มีความคลุมเครือ

คุณควรเปรียบเทียบสองตัวอย่าง

อันแรกตรงกับที่คุณแสดง

#include <iostream>

inline namespace A
{
    int i = 42;
};

namespace B 
{
    static const int i = 5;
};

using B::i;

int g= ::i;

int main() 
{
    std::cout << g << std::endl;

    return 0;
}

โค้ดจะไม่ถูกคอมไพล์เนื่องจาก S( global, i ) มีสมาชิกสองคน

และอีกตัวอย่างหนึ่ง

#include <iostream>

inline namespace A
{
    int i = 42;
};

namespace B 
{
    static const int i = 5;
};

using namespace B;

int g= ::i;

int main() 
{
    std::cout << g << std::endl;

    return 0;
}

โค้ดจะถูกคอมไพล์เนื่องจากชื่อ i ในเนมสเปซ B จะไม่ได้รับการพิจารณา

person Vlad from Moscow    schedule 20.06.2014
comment
ขอบคุณสำหรับคำตอบ แต่ฉันไม่เห็นด้วยกับสิ่งต่อไปนี้: Using declarations are not considered if the set is not empty. 3.4.3.2/2 กล่าวว่าการใช้-คำสั่งจะไม่ถูกพิจารณาหาก S(X, m) ไม่ว่างเปล่า - person ; 20.06.2014
comment
@Dmitry Fucintv ฉันอัพเดตโพสต์ของฉัน ฉันผสมผสานการใช้การประกาศกับการใช้คำสั่ง ฉันขอโทษ. - person Vlad from Moscow; 20.06.2014
comment
ฉันเข้าใจว่า S(X, m) กำหนดได้อย่างไร แต่ฉันอยากจะชี้แจงว่ากฎ or if the context of the reference is a using-declaration (7.3.3), S(X, m) is the required set of declarations of m. หมายถึงอะไรกันแน่ และบริบทของการอ้างอิงกำหนดได้อย่างไร คุณสามารถปรับปรุงคำตอบของคุณได้หรือไม่? - person ; 20.06.2014
comment
@Dmitry Fucintv ไม่มีบริบทคำศัพท์พิเศษในการอ้างอิง ในวลีนี้หมายถึงเพียงว่าชื่อที่อ้างอิงถูกนำมาใช้ในเนมสเปซโดยใช้การประกาศ นั่นคือไม่ว่า namepsace จะประกาศชื่อของตัวเองโดยใช้การประกาศหรือไม่ - person Vlad from Moscow; 20.06.2014
comment
ฉันคิดว่าข้อจำกัดหรือ if the context of the reference is a using-declaration (7.3.3) นั้นไม่จำเป็น เพราะการใช้-การประกาศก็เป็นการประกาศเช่นกันและผมคิดว่ามันมากเกินไป ฉันถูกไหม? - person ; 20.06.2014