为什么char既没有签名也没有签名,但wchar_t是?

Tre*_*key 7 c++ overloading wchar-t implicit-conversion

以下C++程序编译时没有错误:

void f(char){}
void f(signed char){}
void f(unsigned char){}
int main(){}  
Run Code Online (Sandbox Code Playgroud)

wchar_t同一程序的版本不是:

void f(wchar_t){}
void f(signed wchar_t){}
void f(unsigned wchar_t){}
int main(){}
Run Code Online (Sandbox Code Playgroud)

错误:重新定义'void f(wchar_t)'
void f(签名的wchar_t){}

似乎wchar_t就是这样unsigned.
为什么重载不一致?

use*_*267 9

chars为所有不同类型的,并且可以被重载

[basic.fundamental]/1

[...] Plain char,signed charunsigned char三种不同的类型,统称为窄字符类型.[...]

wchar_t也是一个不同的类型,但它不能用signed或限定,unsigned只能与标准整数类型一起使用.

[dcl.type]/2

作为一般规则,最多一个类型说明符被允许在完全DECL说明符-SEQ声明的或在一个 类型说明符序列尾随类型说明符-SEQ.此规则的唯一例外情况如下:

[...]

signedunsigned可以结合char,long,short,或int.

[dcl.type.simple]/2

[...]表9总结了简单类型说明符的有效组合及其指定的类型.

在此输入图像描述

签名wchar_t是实现定义的:

[basic.fundamental]/5

[...] Type wchar_t应具有与其他整数类型相同的大小,符号和对齐要求(3.11),称为其基础类型.

  • @TrevorHickey提交错误报告:) (3认同)