1

gcc は次のコードを受け入れますが、clang は拒否します。

struct S
{
    struct Type
    {
    };
    operator Type()
    {
        return Type();
    }
};
void f(S& s)
{
    s.operator Type(); // error: unknown type name 'Type'
}

標準はType、「オブジェクト式のクラスで検索される」と述べていますS。gcc は検索に のメンバーを含めているようですが、Sclangは考慮するだけSで、その基本クラスは考慮しません。どちらが正しい?

C++ Working Draft N3337 からの関連する引用:

3.4.5 クラスメンバーアクセス [basic.lookup.classref]/7

id-expression が conversion-function-id の場合、最初にその conversion-type-id がオブジェクト式のクラスで検索され、見つかった場合はその名前が使用されます。それ以外の場合は、postfix-expression 全体のコンテキストで検索されます。

4

1 に答える 1

1

この特定のケースでは、gcc が適切です。ルックアップ ルールTypeは、最初にオブジェクトのタイプのコンテキストでルックアップを実行し、次に式が使用されている場所のコンテキストで実行する必要があることを示しています。標準では、正確ではありませんが、あなたのものに似ている例も提供されています。

struct A { };
namespace N {
  struct A {
    void g() { }
    template <class T> operator T();
  };
}
int main() {
   N::A a;
   a.operator A(); // calls N::A::operator N::A
}

ルックアップ::N::Aは、挿入された名前Aを見つけた内部で開始し、それを::N::A.

于 2013-08-14T21:39:30.953 に答える