21

次のコードの場合:

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 の両方がコードを受け入れることに注意してください。

4

1 に答える 1

20

gccは正しいですが、診断を行うためにclangは必要ありません(3.3.7):

クラスSで使用される名前Nは、そのコンテキストで、Sの完全なスコープで再評価されるときに、同じ宣言を参照するものとします。このルールの違反に対して診断は必要ありません。

これは、クラススコープがどのように機能するかによるものです。fooofはクラスのスコープ全体void foo();に表示されるため、の宣言により、typedef内のの意味が関数の名前を参照するように変更されます。Avoid foo();foostruct foofoo

于 2013-03-21T03:07:13.143 に答える