2012-11-29 21 views
7

C++ 03 Chuẩn 7.3.1.1 [namespace.unnamed] đoạn 1: (và C++ 11 Tiêu chuẩn cũng sử dụng định nghĩa tương tự)C++ vô danh (anonymous) namespace nét

Một giấu tên-namespace- định nghĩa cư xử như thể nó đã được thay thế bởi

namespace unique { /* empty body */ } 
using namespace unique; 
namespace unique { namespace-body } 

Tại sao không phải là nó chỉ đơn giản sau đây định nghĩa?

namespace unique { namespace-body } 
using namespace unique; 

Câu hỏi phụ: MSDN được xác định theo dạng sau. Liệu nó vi phạm tiêu chuẩn kỹ thuật?

+1

Tôi nghĩ rằng điều này là do trong 'không gian tên-body' bạn truy cập các thực thể không có trình độ bổ sung, yêu cầu' sử dụng không gian tên duy nhất' có hiệu lực rồi. –

+3

@mat trong phần thân của một không gian tên bạn luôn có thể tham chiếu đến những thứ được định nghĩa trong không gian tên đó mà không cần giấy chứng nhận –

+0

@ JohannesSchaub-litb: Tôi biết, tôi đã tự hỏi về tác động của các xung đột với môi trường xung quanh mặc dù –

Trả lời

7

Bạn không thể làm điều này nữa

namespace { typedef int a; ::a x; } 

Lưu ý rằng trong một tiếp theo namespace { ... }, đột nhiên bạn có thể. Điều này sẽ không phù hợp khủng khiếp.

Cũng cần lưu ý trường hợp này, với hai kết quả có giá trị khác nhau

namespace A { void f(long); } 
using namespace A; 

namespace { 
    void f(int); 
    void g() { 
    ::f(0); 
    } 
} 

Với ISO C++, đây gọi là phiên bản int của f. Với định nghĩa thay thế của bạn, nó gọi phiên bản long.

+2

hình dung từ câu trả lời của bạn là ý nghĩa của tiêu chuẩn là "định nghĩa trong tiêu chuẩn đảm bảo rằng các tên được khai báo trong không gian tên có thể được gọi trong cơ thể không gian tên bằng cách hoàn toàn đủ điều kiện sử dụng không gian tên chung. Ví dụ ..." –