struct A{
operator auto(){
return 0;
}
};
int main(){
A a;
a.operator auto(); // #1
a.operator int(); // #2
}
GCC接受#2是显式调用转换函数的正确方式,而Clang接受#1。
由于以下规则,#1
似乎格式错误:
dcl.spec.auto#6
在本节未明确允许的上下文中使用自动或Decltype(自动)的程序格式错误。
[dcl.spec.auto]节中不明确允许这种用法a.operator auto()
,因此它应该是格式错误的。然而,对于GCC接受的第二种用法,本标准并未规定,转换函数id
(其中,转换类型id
被推导类型替换)表示转换函数的名称。换句话说,声明中声明的转换函数id
是运算符auto
,而不是运算符int
。前者具有与声明的声明器id相同的令牌。根据语法,非限定id运算符auto
应该是该转换函数的名称。那么,如何显式调用这个转换函数呢?当转换函数包含占位符说明符时,标准中是否未对转换函数的名称进行详细说明?
这似乎不够精确。
10.1.7.4自动说明符:
占位符类型可以与函数声明符一起出现在decl说明符seq、类型说明符seq、转换函数id或尾部返回类型中,在此类声明符有效的任何上下文中。
准确地阅读,人们可能会在这里区分“can”和更强的“can only”,即可能为编译器内在函数打开自由度的空间(严格错误与未指定的行为)。
而
3.4.5类成员访问
则表示:
7如果id表达式是转换函数id,则首先在对象表达式的类中查找其转换类型id,并使用名称(如果找到)。
如果auto关键字在该上下文中是否可以有效地成为完全限定的转换类型id,那么再次为解释留出空间。
你的问题本身可能需要进一步扩展,即
运算符Auto()使用的重载规则是什么,即它是否可以用于已经在类定义级别上的常规候选竞争?(Clang和Gcc的情况并非如此,除了额外的运算符int()之外,它们都先验地接受运算符...)
- 是否可以使用显式成员运算符引用(您的案例1)来调用运算符Auto(),即有效地,它有一个(唯一的)可访问名称?允许这将与关键字的所有其他明确允许的用例相矛盾。
我已经在几个clang修订中看到了对此的显式测试,因此它的行为不是隐式命名约定应用的人工制品,而是明显需要的行为。
正如在评论中已经提到的,至少与gcc相比,Clang的行为在这里更为全面一致,因为它完全清楚,其中auto关键字用于类型推断,而名称/函数id解析。那里的运算符auto()被当作一个更显式的自身实体处理,而对于gcc,它具有类似于lambda的匿名字符,但即使是显式成员运算符访问方式,它也涉及候选竞争。
有了,我可以使用表示
我有一个字符串返回给我,其中包含转义字符。 这是一个示例字符串 " test\40gmail.com " 如您所见,它包含转义字符。我需要将其转换为其实际值,即 " test@gmail.com " 我该怎么做?
C++98标准提供隐式和显式两种构造函数,也就是说,声明为显式形式的构造函数所定义的转换只能用于显式转换,而其他形式的构造函数则用于隐式转换。例如: struct S { S(int); }; // “普通构造函数”默认是隐式转换 S s1(1); // ok, 直接构造 S s2 = 1; // ok, 隐式拷贝构造 void f(S); // 能通过编译(但是经常会产
本文向大家介绍C#显式类型转换,包括了C#显式类型转换的使用技巧和注意事项,需要的朋友参考一下 示例
本文向大家介绍把对象转换到字符串类型是如何转换的?相关面试题,主要包含被问及把对象转换到字符串类型是如何转换的?时的应答技巧和注意事项,需要的朋友参考一下 #2928 (comment) 首先会查找对象是否实现了方法。 一般来说方法决定了和的调用顺序,该方法接受一个参数 ,当 为时,则调用方法;为时,则调用方法。 例:
问题内容: 我正在寻找一种将包含字符转义序列的字符串转换为表示的字符的方法。 因此,例如,我想将字符串(具有两个字符,一个反斜杠和一个双引号)解析为char 。因此,将一个字符数组转换为一个字符。 因此,可能会执行以下操作,反之亦然: 我不敢相信java.lang或其他任何东西都不能为此提供良好的代码(也许是本地代码),因为我觉得上面的代码可能不完整,并且无法解析每个有问题的(可逃避的?)字符,因