2012-08-27 11 views
22

tôi thử nghiệm trên hai trình biên dịch, và rất ngạc nhiên khi thấy cả hai hỗ trợ sau nét mà không phàn nàn:Tại sao trình độ phạm vi dự phòng được trình biên dịch hỗ trợ và nó có hợp pháp không?

class A { 
    A(); 
}; 

A::A::A() {} 
    ^^^ 

Lưu ý rằng điều này cũng thành công cho các phương pháp, mặc dù nó được gắn cờ khi khai báo là quá đủ điều kiện.

Câu hỏi:

  • này một chương trình hợp lệ C++ là?
  • Nếu có, mục đích của nó là gì - hoặc nó chỉ là sản phẩm phụ?

Cập nhật chi tiết:

Trong trường hợp các câu hỏi ban đầu là không rõ ràng hoặc quá ngắn: Tôi tò mò tại sao trình độ dư thừa được phép trên nét (nhấn mạnh cũng nói thêm ở trên).


Clang một của Apple GCC 4.2 + LLVM là trình biên dịch

+1

Điều này đã được hỏi, nhưng tôi đoán nó là một khó khăn hơn để tìm hơn một số. – chris

+0

@chris tôi đã xem qua một vài trang, nhưng không tìm thấy gì cả - vui lòng đóng nếu có một bản nằm. có lẽ tôi chỉ không tìm kiếm bằng cách sử dụng các điều khoản thích hợp. – justin

+2

Điều này * có thể * trợ giúp: http://stackoverflow.com/questions/11423380/why-are-redundant-class-name-qualifiers-allowed – chris

Trả lời

18

Vâng, nó cho phép (§9/2):

Các class-name cũng được đưa vào phạm vi của chính lớp đó; điều này được gọi là tên lớp được tiêm. Với mục đích kiểm tra truy cập, tên lớp được tiêm được coi như là tên thành viên công khai.

Để biết thông tin về lý do dẫn đến tiêm tên lớp, bạn có thể muốn đọc N0444.

+0

cảm ơn (+1) - tôi đã sửa đổi câu hỏi để nhấn mạnh rằng định nghĩa * là một phần đã thực sự tò mò với tôi (và tôi nhận ra rằng có thể không thay đổi câu trả lời của bạn). – justin