Код: Выделить всё
static_assert(std::same_as); // compiles
Первый операнд-это prvalue типа класса, и не существует базовых и полученных типов, поэтому применяется expr.cond#4.3.3. > (пока не тип результата) должен быть std :: string . Я знаю, что в этом пункте говорится: < /p>
... /p>
Но именно поэтому это объяснение неверно, но если мы предположим, что std :: string {} операнд дает нам целевой тип std :: string (каким -то образом, с этим пунктом) и потому что нет способа преобразовать std :: string в const char [4] (так что expr.cond# 4.6. Удовлетворенное), это означает, что неявная последовательность преобразования для второго операнда сформирована на std :: string и это: преобразование массива в указатель (
Код: Выделить всё
const char[4] -> const char*
Так что теперь мы идем рядом с эксплуатацией .cond#5, который не удовлетворен, потому что у нас есть оба Prvalues of std :: string , поэтому используется expr.cond#6, и мы проходим через остальную часть, у нас есть наш тип результата Prvalue of Std :: string .
#2:
This expr.cond#4.3.3 не работает , именно потому, что первый операнд-это PrValue, и не может применяться преобразование LVALUE в RVALE. И этот экспресс -концентрас № 5 также не делает. Таким образом, мы уехали с expr.cond#6, но он написал: < /p>
.....soverload Resolution используется для определения конверсий (если таковые имеются) к операндам ([over.match.oper], [over.built]). ... < /p>
< /blockquote>
Это Over.match.oper и Over.buted, насколько я могу судить, только об перегруженных операторах (не имеет значения в Эта проблема) и функции преобразования (которые std :: string не имеют ни одного) для встроенных типов. И в целом у меня есть ощущение, что весь этот пункт только о преобразовании типов классов в встроенные типы, поэтому нет конструкторов. Но если мы предположим, что в expr.cond#6 преобразование конструкторов можно было бы вызвать (как тот, который std :: string ), то результат является prvalue of std :: string . br /> Примечание № 1: < /strong> версия черновика, которую я связывал, в этом пункте expr.cond #7, только упоминает: < /p>
Стандартные преобразования массива в указатель и функционирование в установку ... < /p>
< /blockquote>
Но C ++ 20 Проект в той же пункте Также преобразование "lvalue to-rvalue". Мне любопытно, почему такие изменения были внесены, хотя что -то вроде этого оператора int & (); в expr.cond#6 может сделать один из операндов. Может помочь с проблемой. Ничего не упомяните о определенных пользователях преобразовании на этом этапе expr.cond#6. И эти преобразования, вероятно, также тонкая точка здесь. Может, подумать о примере, это поможет.
Подробнее здесь: https://stackoverflow.com/questions/794 ... ring-how-t