2013-03-20 24 views
16

Đối với đoạn mã sau:Tuyên bố của phương pháp thay đổi ý nghĩa của biểu tượng

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

GCC đưa ra một lỗi biên dịch:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive] 
    void foo(); 
      ^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive] 
struct foo {}; 
     ^

Nhưng vang chấp nhận nó mà không có lỗi biên dịch. Ai đúng?

Lưu ý rằng nếu typedef bị xóa hoặc thay đổi thành typedef ::foo foo_type, cả gcc và clang sẽ chấp nhận mã.

+0

Câu hỏi thực sự là: * Tại sao * Clang luôn đúng? –

+1

khi không có typedef thì nó không phải là lạ – 4pie0

+0

@ cf16: Tôi không nói đó là. Tôi chỉ muốn chỉ ra rằng, mặc dù lỗi không đề cập đến typedef, typedef có liên quan đến lỗi này. – HighCommander4

Trả lời

17

gcc là đúng, nhưng kêu vang không cần thiết để đưa ra một chẩn đoán (3.3.7):

A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.

Điều này là do phạm vi lớp học làm việc như thế nào. Các foo của void foo(); có thể nhìn thấy trong toàn bộ phạm vi của lớp A, vì vậy việc kê khai của void foo(); thay đổi ý nghĩa của foo trong typedef từ đề cập đến struct foo đến tên của hàm foo.

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