string_view
演算子を使用してリテラルを定義したいのですsv
が、アプリケーションは ANSI または UNICODE としてコンパイルできるため、Microsoft の_T
マクロ fromを使用しますtchar.h
。
sv
ポインター/文字列に演算子を適用したいので、wchar_t
これを書く必要があると思いました:
using namespace std::literals;
constexpr static auto H1{_T("hello")sv};
しかし、これはコンパイルされず、次のエラーが発生します。
error C2146: syntax error: missing ')' before identifier 'sv'
error C2143: syntax error: missing ';' before '}'
error C2059: syntax error: '}'
ただし、これを書くと、コンパイルして正しく動作します。
using namespace std::literals;
constexpr static auto H2{_T("hello"sv)};
sv
最初の選択肢は、2 番目の選択肢が演算子がchar
-pointer/string に適用されているように見えるため、実際には Unicode 文字列に適用されているように見えるため、より論理的に思えます (/D_UNICODE
オプションを使用して Unicode でコンパイルした場合)。
奇妙なことに、次のコードをコンパイルしようとすると:
using namespace std::literals;
constexpr static auto H1{_T("hello")sv};
constexpr static auto H2{_T("hello"sv)};
constexpr static auto H3{L"hello"sv};
上記で説明したように、最初の行はコンパイルされません。しかし、/EP
オプションをコンパイラに追加すると (プリプロセッサの出力を含むファイルが得られます)、プリプロセッサがこれらの行を次のように変換することがわかります。
using namespace std::literals;
constexpr static auto H1{L"hello"sv};
constexpr static auto H2{L"hello"sv};
constexpr static auto H3{L"hello"sv};
そして、この出力のコンパイルは成功します。
そのため、前処理のみでコンパイルが機能します。一度にコンパイルすることはできません。
C++ 標準には、最初の代替手段 (私にはより論理的と思われる) の使用を禁止するものはありますか? そうでない場合、これは Microsoft コンパイラのバグですか?