![](/img/trans.png)
[英]Visual C++ - UTF-8 - CA2W followed by CW2T with MBCS - Possibly a bad idea?
[英]Unable to use CA2CT and CW2T in Visual Studio 2022 when C++20 is specified
我在尝试将 C++20 与 Visual Studio 2022 结合使用时遇到问题:
例如:
CA2CT
CW2T
CA2W
错误 C2440:“初始化”:无法从
ATL::CA2W
转换为ATL::CStringT<wchar_t,StrTraitMFC<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
如果我恢复到 C++17 就可以了。
为什么是这样?
这是一个例子:
CLSID AppCLSID ;
if (SUCCEEDED(::CLSIDFromProgID(CT2W(rstrProgID), &AppCLSID) ) )
{
LPOLESTR pszName = NULL ;
if (SUCCEEDED(::ProgIDFromCLSID(AppCLSID, &pszName) ) )
{
CString strAppID = CW2T(pszName);
}
}
请注意, rStrProgId
可能是_T("Word.Application")
之类的值。
上面的具体情况错误是:
错误 C2440:“初始化”:无法从
ATL::CW2W
转换为ATL::CStringT<wchar_t,StrTraitMFC_DLL<wchar_t,ATL::ChTraitsCRT<wchar_t>>>
其他代码片段为例:
CString strCalendarName = CA2CT(pName->GetText(), CP_UTF8);
( pName->GetText()
的值为const char *)
。
做@Inspectable 所说的解决了一个问题。
其他无法编译的(示例)是:
std::string s1 = CT2A(strNameText);
CString strStudent1 = CA2CT(pElement1->GetText(), CP_UTF8);
还有其他编译问题,但我觉得它们不在这个问题的 scope 范围内。
该问题显然与/permissive-
编译器选项有关。 如果选择 c++20,编译器会强制使用/permissive-
选项。
/permissive-
选项由 /std:c++latest 选项在 Visual Studio 2019 版本 16.8 中隐式设置,在版本 16.11 中由 /std:c++20 选项隐式设置。/permissive-
是C++20
模块支持所必需的。
启用/permissive-
或/std:c++20
,编译器将不允许CStringA a = CW2A(L"123");
(我认为因为CW2A/CA2W
使用转换运算符将TCHAR*
缓冲区返回到CString
),所以它需要列表初始化
CStringA a { CW2A(L"123") };
在我看来,这是一个更具历史意义的 [ally known] 问题。 据我所知,这与CString
类的隐式处理有关(隐式运算符: operator LPCTSTR()
等 - 例如,与std::string
可能有意显式的.c_str()
等相反)。
[ 可能相关的主题:https://aras-p.info/blog/2008/10/09/implicit-to-pointer-operators-must-die/ ]
这导致所需的“双重转换”/“双重转换”(对于不准确的术语表示抱歉:()从 RHS 到 LHS( CString
),MSVC 一直草率地接受它(就像其他烦人的草率 MSVC 处理一样),然而,例如 gcc 很长一段时间(永远?)一直不允许(可能是由于语言规范要求),导致在尝试使用 gcc 对CString
进行某些转换时失败(最好不要问我我是怎么知道的)。这里的问题应该可以通过做来解决
CString strAppID = static_cast<LPCTSTR>(CW2T(pszName));
或者
CString strAppID = CW2T(pszName).m_psz;
(顺便说一句,哪个更好?
.m_psz
是实现细节(特定成员)但有趣的是与 T 无关static_cast<LPCTSTR>
是非特定于实现但特定于 T)
但是,正如其他地方所评论的那样,这些是此 C++ 规范更改开关所需的源代码更改(可能很多)。 尽管这是使现有 [不完全精确] 代码适合其他(通常更严格/精确)规范/环境的常见业务。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.