我想string_view
使用运算符定义文字sv
,但由于我的应用程序可以编译为 ANSI 或 UNICODE,因此我使用 Microsoft_T
的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
运算符应用于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++ 标准中是否有任何内容禁止我使用第一种替代方案(这对我来说似乎更合乎逻辑)?如果不是,这是微软编译器中的错误吗?