jac*_*k X 28 c++ language-lawyer
struct A{
operator auto(){
return 0;
}
};
int main(){
A a;
a.operator auto(); // #1
a.operator int(); // #2
}
Run Code Online (Sandbox Code Playgroud)
GCC接受 #2 是显式调用转换函数的正确方法,而Clang接受 #1。
#1
由于以下规则,这似乎是错误的:
dcl.spec.auto#6
在本节未明确允许的上下文中使用 auto 或 decltype(auto) 的程序是格式错误的。
a.operator auto()
在 [dcl.spec.auto] 部分中没有明确允许这种用法,因此它应该是格式错误的。然而,对于第二使用,这是由GCC接受时,标准并没有说在conversion-function-id
其中conversion-type-id
被由推导的类型替换表示转换功能的名称。换句话说,声明conversion-function-id
中声明的operator auto
不是operator int
。前者与声明的 declarator-id 具有相同的标记。根据语法,unqualified-idoperator auto
应该是那个转换函数的名字。那么,如何显式调用这个转换函数呢?当转换函数包含占位符说明符时,它是否在标准中没有指定哪个是转换函数的名称?
看来,这还不够精确。
10.1.7.4 The auto specifier
:在这种声明符有效的任何上下文中,占位符类型可以与函数声明符一起出现在 decl-specifier-seq、type-specifier-seq、conversion-function-id或 trailing-return-type 中。
仔细阅读,人们可能会在此处区分“可以”和更强的“只能”,即可能为编译器内在函数的自由度开辟空间(完全错误与未指定的行为)。
并3.4.5 class member access
说:
7 如果id-expression 是一个conversion-function-id,则首先在对象表达式的类中查找其conversion-type-id,如果找到,则使用名称。
再次为 auto 关键字在此上下文中是否可以有效地成为完全限定的转换类型 ID 留出解释空间。
您的问题本身可能需要进一步分支,即
我已经在几个 clang 修订版中看到了对此的显式测试,因此它的行为不是隐式命名约定应用程序的人工制品,而是明显期望的行为。
正如评论中已经提到的那样,至少与 gcc 相比,Clang 的行为在这里更加一致,因为它在那里完全清楚,其中 auto 关键字用于类型推导以及名称/函数 ID 解析的位置。操作符 auto() 在那里被处理为一个更明确的自己的实体,而对于 gcc,它具有类似于 lambda 的匿名字符,但即使对于显式成员操作符访问方式也参与候选竞争。
归档时间: |
|
查看次数: |
616 次 |
最近记录: |