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++ 工作草案 N3337 的相关引用:
3.4.5 类成员访问 [basic.lookup.classref]/7
如果 id-expression 是转换函数 ID,则首先在对象表达式的类中查找其转换类型 ID ,如果找到,则使用名称。否则在整个后缀表达式的上下文中查找它。