2014-11-10 15 views
5

Tham chiếu đến tên tồn tại trong không gian tên chưa đặt tên và kết quả không gian tên cục bộ có lỗi do sự mơ hồ hoặc độ phân giải được xác định rõ không? Tôi thấy công việc sau đây tốt đẹp trên G ++ và Clang, ít hơn trên MSVC.Độ phân giải không tên và được đặt tên

namespace Foo 
{ 
    class Bar 
    { 
    public: 
     int x; 
    }; 
} 

namespace 
{ 
    class Bar 
    { 
    public: 
     int y; 
    }; 
} 

namespace Foo 
{ 

void tester() 
{ 
    Bar b; 
} 

} 

int main() 
{ 
    Foo::tester(); 
    return 0; 
} 

Trả lời

3

GCC và Clang là đúng. Trong phạm vi Foo::tester, việc sử dụng không đủ tiêu chuẩn của Bar chỉ rõ ràng là Foo::Bar.

tra cứu không đủ điều kiện được quy định bởi C++ 11 3.4.1/1:

phạm vi được tìm kiếm một bản tuyên bố theo thứ tự được liệt kê trong mỗi loại tương ứng; tra cứu tên kết thúc ngay khi khai báo được tìm thấy cho tên.

Phạm vi tìm kiếm cho việc sử dụng một tên trong một chức năng được liệt kê trong 3.4.1/6:

Một tên được sử dụng trong định nghĩa của một hàm [...] đó là một thành viên của không gian tên N [...] phải được khai báo trước khi sử dụng trong khối [...] hoặc, sẽ được khai báo trước khi sử dụng trong không gian tên N hoặc, nếu N là không gian tên lồng nhau, sẽ được khai báo trước khi sử dụng một trong những không gian tên kèm theo của N.

Trong trường hợp này, chức năng là thành viên của Foo, vì vậy Foo được tìm kiếm trước khi kèm theo không gian tên (toàn cầu), trong đó bao gồm không gian tên vô danh. Foo::Bar được tìm thấy ở đó và tra cứu kết thúc.

Các vấn đề liên quan