Поэтому я обновлял некоторый код для использования в явном виде и столкнулся с кажущимся непоследовательным поведением примерно так:
explicit Whatever(const wchar_t* const pszVal)
Это не работает с литеральной строкой типа const wchar_t [x], и явное предотвращает его принятие в вышеуказанном конструкторе.Он жалуется, что
const wchar_t [x] не может быть преобразован в const wchar_t * const
.
Но, если я добавлю один для массиваСценарий:
explicit Whatever(const wchar_t pszVal[])
Затем он утверждает, что этот конструктор уже существует и что это вышеупомянутый конструктор, который не примет форму массива.Так что это похоже на уловку-22, которая помешала бы мне иметь явный конструктор для буквенных строк.
Это Visual C ++ 2017. Я что-то здесь упускаю?Конечно, я был бы рад предоставить дополнительный конструктор, но он, кажется, работает непоследовательно.
Хорошо, просто для продолжения, так как это не сработает в комментарии очень легко,Сценарии таковы:
class AString { Whatever(const wchar_t* const val) {} } ;
class Something { Something(const AString& val) {} };
Создание чего-то, проходящего через литерал, завершается неудачно, потому что оно не преобразует L "X" в AString:
Something MySomething(L"X");
Очевидно, что это не то, чтоЯ думал, но неожиданно для меня.У AString есть действительный конструктор для wchar_t.Почему вышеупомянутое просто не создает временный?
Если именно так на самом деле и должно работать явное, то это наполовину бесполезно, так как вы никогда не сможете сделать какие-либо фундаментальные классы такого рода явными, если вы хотите получить параметры этого типа, но передать то, что вы явносказал, что вы хотите, чтобы этот класс принял, верно?