如果对一个对应于转换函数模板的转换函数标识符应用反射运算符,其结果表示什么?
考虑如下:
#include <meta>
struct A {
template<class T>
operator T();
};
constexpr auto r = ^^A::operator int;
GCC 16认为 r 表示转换函数模板。Clang(实验性P2996分支)和EDG(实验性反射实现)认为 r 表示从模板实例化出的函数。(demo)
哪个编译器是正确的?
解决方案
GCC的判断不正确。Clang和 EDG的实验实现是正确的。
一个 reflect-expression 具有以下四种形式之一:^^::、^^reflection-name、^^type-id、^^id-expression,其中一个 reflection-name 是一个(可能带限定符的)标识符。由于 operator int 不是一个标识符,且它不表示一个类型,因此采用最后一种解释(^^id-expression)。
形如 ^^id-expression的 reflect-expression R表示如下被确定的实体:
- [...]
- 否则,如果id-expression表示一个重载集合S,则对表达式 &S在没有目标的情况下进行重载分辨应选择一个唯一的函数([over.over]);R表示该函数。
- [...]
在这里,&A::operator int 表示从转换函数模板实例化出的唯一函数。因此,^^A::operator int 表示该函数。
显然,GCC未能考虑到这种情形。
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。