Декларация метода изменяет значение символа - программирование
Подтвердить что ты не робот

Декларация метода изменяет значение символа

Для следующего кода:

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

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

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

4b9b3361

Ответ 1

gcc правильный, но clang не требуется для диагностики (3.3.7):

Имя N, используемое в классе S, должно ссылаться на одно и то же объявление в его контекста и при повторной оценке в завершенном объеме С. Нет для нарушения этого правила требуется диагностика.

Это связано с тем, как работает область видимости класса. foo of void foo(); отображается внутри области целиком класса A, поэтому декларация void foo(); изменяет значение foo в typedef, ссылаясь на struct foo к имени функции foo.