Явный конструктор char * против строкового литерала - PullRequest
0 голосов
/ 10 февраля 2019

Поэтому я обновлял некоторый код для использования в явном виде и столкнулся с кажущимся непоследовательным поведением примерно так:

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.Почему вышеупомянутое просто не создает временный?

Если именно так на самом деле и должно работать явное, то это наполовину бесполезно, так как вы никогда не сможете сделать какие-либо фундаментальные классы такого рода явными, если вы хотите получить параметры этого типа, но передать то, что вы явносказал, что вы хотите, чтобы этот класс принял, верно?

...