繁体   English   中英

指定 C++20 时无法在 Visual Studio 2022 中使用 CA2CT 和 CW2T

[英]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>>>


其他代码片段为例:

示例 2

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- (符合标准)

/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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM