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 は検索に のメンバーを含めているようですが、S
clangは考慮するだけは考慮しません。どちらが正しい?S
で、その基本クラス
C++ Working Draft N3337 からの関連する引用:
3.4.5 クラスメンバーアクセス [basic.lookup.classref]/7
id-expression が conversion-function-id の場合、最初にその conversion-type-id がオブジェクト式のクラスで検索され、見つかった場合はその名前が使用されます。それ以外の場合は、postfix-expression 全体のコンテキストで検索されます。