C/C++の単項演算子 + について

C++ で charstd::cout とかで出したいとき、

char hoge = 'a';
std::cout << +hoge;

みたいに書くと a じゃなくて 97 が出る。これはなぜなのか。

C11 ではこのように述べられている。

The result of the unary + operator is the value of its (promoted) operand. The integer promotions are performed on the operand, and the result has the promoted type.

C++17 ではこのように述べられている。

The operand of the unary + operator shall …(略)
Integral promotion is performed on integral or enumeration operands. The type of the result is the type of the promoted operand.

というわけで C、C++ 両方で単項演算子 + の結果は汎整数拡張がなされた結果になる。 hogechar+hogeint の型を持つということになり、 operator<<int オーバーロードが呼ばれ、97 が出力された。

参考にした資料

手元にあった C11 と C++17 の最終ドラフトで確認した。 より新しい規格では仕様が変わっている可能性もある。