我已在GCC
编译器中编译并运行以下代码片段。它成功地运作了。
#include <iostream>
using namespace std;
int main()
{
char ch = char('A');
cout<<ch<<endl;
return 0;
}
输出:
A
那么,是char()内置类型函数还是系统调用?
答案 0 :(得分:11)
从技术上讲,这是一个类型转换。标准中用于描述语法的短语是“显式类型转换(功能表示法)”。标准([expr.type.conv] / 2)的效果描述如下:
如果初始值设定项是带括号的单个表达式,则类型转换表达式是等效的(在定义中, 并且如果在意义上定义)到相应的强制转换表达式(8.4)。 [...] [T]表达式是指定类型的prvalue,其结果对象使用初始化程序进行直接初始化(11.6)。
在这种情况下,您将从'A'(字符文字)开始,它已经具有char
1 类型,并将其转换为char
(所以演员没有任何效果,也没有任何成就。)
如果对具有采用正确参数类型的构造函数的类型执行此操作,则可以使用该类型的构造函数进行转换。但对于其他演员表示法也是如此,例如使用(T)x
或static_cast<T>(x)
。这种语法没有任何关于使用ctor的信息,而不是任何其他可以进行转换的语法。由于您已明确转换,因此可以使用它来调用标记为explicit
的ctor,但除此之外,它实际上并没有任何不同(就是否使用ctor而言)而不仅仅是{{ 1}}(没有强制转换,但可能还包括转换)。
1.请注意,这是C ++与C不同的地方。在C中,字符文字的类型为T ch = value;
,而不是int
。
功能
答案 1 :(得分:4)
声明:
char ch = char('A');
调用char
类型的构造函数需要char
。它不是函数或任何系统调用。实际上,对于基本数据类型,它甚至不是一个调用,它只是一个语法糖,所以任何类型T
都可以这样初始化:
T var = T(arg);
在编写模板函数和类时,这种方法非常有用。因此,只要类型T
(模板类型参数)进入,编译器就不会抱怨char(arg)
无效。