Условное выражение оператора с операциями STD :: String и C-String, как объяснить тип результата в соответствии со стандC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Условное выражение оператора с операциями STD :: String и C-String, как объяснить тип результата в соответствии со станд

Сообщение Anonymous »

Из этого примера: < /p>

Код: Выделить всё

static_assert(std::same_as); // compiles
Вы можете увидеть, что результатом условного выражения является prvalue std :: string . Но я не могу объяснить это в соответствии со стандартом. /p>
Первый операнд-это 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*
), а затем, определяемый пользователем конструктор конструктора std :: string , который принимает 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»