Ошибка назначения 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

Другие вопросы по тегам