这是一个代码 -
1 int main(int argc, char *argv[])
2 {
3 signed char S, *psc;
4 unsigned char U, *pusc;
5 char C, *pc;
6
7 C = S;
8 C = U;
9
10 pc = psc;
11 pc = pusc;
12
13 return 0;
14 }
$ gcc test.cpp -o a
test.cpp: In function ‘int main(int, char**)’:
test.cpp:10:7: error: invalid conversion from ‘signed char*’ to ‘char*’ [-fpermissive]
test.cpp:11:7: error: invalid conversion from ‘unsigned char*’ to ‘char*’ [-fpermissive]
这是在 Intel 32 位机器上的 Ubuntu 12.10 上的 gcc 版本 4.6.3 上编译的。
考虑到char
类型是unsigned char
on x86. -
如果第 7 行和第 8 行对非指针类型的赋值正常,为什么第 10 行和第 11 行的指针类型会引发错误?
另外,应该C = U
无需演员就能成功?
首先,需要强调的是,char
, signed char
, and unsigned char
都是不同种类。 C++11 标准的第 4.10 节定义了不同类型指针之间的三种可能的标准指针转换:
1.空指针常量是计算结果为零的整数类型的整型常量表达式 (5.19) 纯右值或 std::nullptr_t 类型的纯右值。空指针常量可以转换为指针类型;结果是该类型的空指针值,并且可以与对象指针或函数指针类型的所有其他值区分开。这种转换称为空指针转换。相同类型的两个空指针值比较相等。空指针常量到 cv 限定类型指针的转换是单个转换,而不是指针转换后跟限定转换的序列 (4.4)。整型的空指针常量可以转换为 std::nullptr_t 类型的纯右值。 [ 注意:生成的纯右值不是空指针值。 ——尾注]
这是不相关的,因为我们没有类型的空指针nulltptr_t
here.
2. “指向 cv T 的指针”类型的纯右值(其中 T 是对象类型)可以转换为“指向 cv void 的指针”类型的纯右值。将“指向 cv T 的指针”转换为“指向 cv void 的指针”的结果指向类型 T 的对象所在的存储位置的开头,就好像该对象是类型 T 的最派生对象(1.8) (即不是基类子对象)。空指针值转换为空指针值
目的地类型。
这不能应用,因为目标类型不是void
。最后,
3. “指向 cv D 的指针”类型的纯右值(其中 D 是类类型)可以转换为“指向 cv B 的指针”类型的纯右值,其中 B 是 D 的基类(第 10 条)。如果 B 是如果 D 的基类不可访问(第 11 条)或不明确(10.2),则需要此转换的程序格式错误。转换的结果是指向派生类对象的基类子对象的指针。空指针值被转换为
目标类型的空指针值。
signed char
不是 的基类char
,所以这也不适用。
因此,隐式的、标准的指针转换signed char
to char
无法执行。
另一方面,根据第 4.7 段的规定,允许整数类型值之间的转换。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)