C++20ではUTF-8エンコーディングされた文字の型としてchar8_tを追加しました。
ref: ttps://cpprefjp.github.io/lang/cpp20/char8_t.html
すでにgcc, clang, msvcでは実装が終わっていて使える状況にあります。
このとき、C++11で追加された文字列へのu8 prefixを使っているユーザー側のコードが動かなくなります。
例えばつぎのコードはMSVCでは/std:latestでは動きません(VS16.1から)(話逸れますがAddSubstitutionFontToHandle便利ですね、こういうとき)。
#include <DxLib.h>
int WINAPI WinMain(HINSTANCE , HINSTANCE , LPSTR , int )
{
ChangeWindowMode(true);
if (DxLib_Init() == -1){
return -1;
}
const auto font_handle_yu_goshic = CreateFontToHandle("游ゴシック", -1, -1, DX_FONTTYPE_ANTIALIASING);
const auto font_handle_segoe_ui_emoji = CreateFontToHandle("Segoe UI Emoji", -1, -1, DX_FONTTYPE_ANTIALIASING);
AddSubstitutionFontToHandle(font_handle_yu_goshic, font_handle_segoe_ui_emoji, 0, 0);
SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);
DrawStringToHandle(10, 10, u8"aあ🍣🍺", GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic);
WaitKey();
DxLib_End();
return 0;
}
これを回避するには
#if defined(__cpp_char8_t) && 201803 <= __cpp_char8_t
DrawStringToHandle(10, 10, reinterpret_cast<const char*>(u8"aあ🍣🍺"), GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic);
#else
DrawStringToHandle(10, 10, u8"aあ🍣🍺", GetColor(0xFF, 0xFF, 0xFF), font_handle_yu_goshic);
#endif
のようなコードが必要になりますが、static_castではなくreinterpret_castが必要になりますし、
またそもそもchar8_tの追加背景はUTF-8の保証にありますので、
char8_t型の場合、SetUseCharCodeFormat(DX_CHARCODEFORMAT_UTF8);なしでUTF-8として扱えるべきだと思います。
そこで、201803 <= __cpp_char8_tのときにchar8_tを渡せる版の関数を追加してほしいです。
(__cpp_char8_tはC++標準で定められた機能テストマクロで、MSVC含め使えます)
少なくとも文字列描画系関数は対応が必要ですが、ほかにどこまで対応が必要かは把握できていません。
現状長さ保証版
ttps://dxlib.xsrv.jp/cgi/patiobbs/patio.cgi?mode=view&no=4243
が追加されている中で組合せ爆発しそうではありますが、対応しないというわけにもいかないかなと思います。