0

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

4

0 回答 0