2012-10-11 27 views
9

thể trùng lặp:
Why are redundant scope qualifications supported by the compiler, and is it legal?Có OK để chỉ định phạm vi lớp C++ trùng lặp không?

tôi sẽ không mong đợi điều này để biên dịch nhưng nó. Đây có phải là một lỗi trình biên dịch, hoặc nó có một số ý nghĩa chính xác?

$ g++ -c scopes.cpp 
$ cat scopes.cpp 
class Log { 
public: 
    Log() { } 
    static void fn() { } 
}; 

void test() { 
    Log::Log::Log::Log::Log::Log::fn(); 
} 

$ g++ --version 
g++ (Ubuntu 4.4.3-4ubuntu5.1) 4.4.3 
+0

Lưu ý phụ: Điều này sẽ không được biên dịch theo VC10. Tuy nhiên, cũng giống như một trình biên dịch chấp nhận mã không chứng minh nó là hợp pháp, cũng chỉ vì một trình biên dịch từ chối mã không có nghĩa là nó là bất hợp pháp. –

Trả lời

9

Có, nó hợp pháp. Tên của một lớp được chèn vào không gian tên riêng của nó, được gọi là tên lớp học được tiêm. Từ C++ 03 §9/2:

[...] tên lớp cũng được chèn vào phạm vi của lớp; tên này được gọi là tên lớp được tiêm. Để kiểm tra quyền truy cập, tên lớp được tiêm được coi như là tên thành viên công khai.

Lưu ý rằng Log::Log tên các nhà xây dựng lớp học, mà chỉ được phép trong những bối cảnh nhất định, nhưng miễn là bạn kết thúc chuỗi Log::Log::... với một cái gì đó khác hơn Log (như fn), sau đó nó không tên constructor. Cụ thể, §3.4.3.1/1a nói:

Nếu lồng nhau-tên-specifier đề cử một lớp C, và tên được chỉ định sau khi lồng nhau-tên-specifier, khi nhìn lên trong C , là tên lớp được tiêm của C (khoản 9), thay vào đó, tên được xem là đặt tên cho hàm xây dựng của lớp C. Tên trình xây dựng như vậy sẽ chỉ được sử dụng trong mã khai báo của định nghĩa hàm dựng xuất hiện bên ngoài định nghĩa lớp.

+2

Điều đó hoàn toàn hợp pháp. Hãy thử biên dịch nó. – meagar

+2

@John: Tại sao bạn vẫn còn nghi ngờ rằng đó là hợp pháp sau khi nhìn thấy trích dẫn từ tiêu chuẩn ngôn ngữ C++ và sau khi nhiều trình biên dịch chấp nhận nó mà không có cảnh báo/lỗi? –

+0

Nó là hợp pháp vì nó được xác định hành vi, tài liệu trong spec. – meagar

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