CString 赋值错误
CString assignment error
有人可以解释为什么 strY 赋值不能编译吗?我认为编译器可能已经用构造函数替换了赋值,但 strZ 编译了,strX 也是如此。
unsigned char szArr[]{ 0xD7, 0x53, 0xBF, 0xE7};
CString strX;
strX = szArr;
CString strY = szArr;
// no suitable constructor exists to convert unsigned char[4] to ...
CString strZ(szArr);
进一步 reading/playing 之后,strZ 似乎正在使用此构造函数:
CSTRING_EXPLICIT CStringT(_In_z_ const unsigned char* pszSrc) :
CThisSimpleString( StringTraits::GetDefaultManager() )
之所以有效,是因为它被明确调用
strX 使用默认构造函数然后赋值运算符:
CStringT& operator=(_In_opt_z_ const unsigned char* pszSrc)
感谢 ChristopherOicles 评论:
当定义 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 时,所有采用单个参数的 CString 构造函数都使用 explicit 关键字进行编译,从而防止输入参数的隐式转换。
所以没有 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 定义的 strY 将使用与 strZ 相同的构造函数。 Windows 控制台应用程序的存根在 stdafx.h
中定义
有人可以解释为什么 strY 赋值不能编译吗?我认为编译器可能已经用构造函数替换了赋值,但 strZ 编译了,strX 也是如此。
unsigned char szArr[]{ 0xD7, 0x53, 0xBF, 0xE7};
CString strX;
strX = szArr;
CString strY = szArr;
// no suitable constructor exists to convert unsigned char[4] to ...
CString strZ(szArr);
进一步 reading/playing 之后,strZ 似乎正在使用此构造函数:
CSTRING_EXPLICIT CStringT(_In_z_ const unsigned char* pszSrc) :
CThisSimpleString( StringTraits::GetDefaultManager() )
之所以有效,是因为它被明确调用
strX 使用默认构造函数然后赋值运算符:
CStringT& operator=(_In_opt_z_ const unsigned char* pszSrc)
感谢 ChristopherOicles 评论:
当定义 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 时,所有采用单个参数的 CString 构造函数都使用 explicit 关键字进行编译,从而防止输入参数的隐式转换。
所以没有 _ATL_CSTRING_EXPLICIT_CONSTRUCTORS 定义的 strY 将使用与 strZ 相同的构造函数。 Windows 控制台应用程序的存根在 stdafx.h
中定义