Ошибка назначения CString
Может кто-нибудь объяснить, почему назначение 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);
1 ответ
После некоторого дальнейшего чтения / воспроизведения кажется, что 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, которые принимают один параметр, компилируются с ключевым словом явного, что предотвращает неявное преобразование входных аргументов.
Таким образом, без _ATL_CSTRING_EXPLICIT_CONSTRUCTORS определенный strY будет использовать тот же конструктор, что и strZ. Заглушка для консольного приложения Windows определена в stdafx.h