2013-03-20 2 views
16

Для следующего кода:Декларация метода изменяет значение символа

struct foo {}; 

struct A 
{ 
    typedef foo foo_type; 

    void foo(); 
}; 

GCC дает ошибку компилятора:

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 {}; 
     ^

Но лязг принимает его без ошибок компилятора. Кто прав?

Обратите внимание, что если typedef удален или изменен на typedef ::foo foo_type, то gcc и clang принимают код.

+0

Настоящий вопрос: * Почему * Кланг всегда прав? –

+1

, когда нет typedef, тогда это не странно – 4pie0

+0

@ cf16: Я не сказал, что это было. Я просто хотел указать, что, несмотря на ошибку, не упоминающую typedef, typedef имеет какое-то отношение к ошибке. – HighCommander4

ответ

17

НКУ является правильным, но лязг не требуется, чтобы дать диагностическое (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.

Это происходит потому, что, как работает класс сфера. foo из void foo(); виден в пределах всего объема класса A, так что декларация void foo(); изменяет значение foo в ЬурейеМ ссылаться на struct foo к имени функции foo.

Смежные вопросы