Что касается преобразования lvalue в rvalue, когда оно необходимо?

Я читал довольно много в интернете и кажется, что многие люди упоминали следующие правила (но я не смог найти это в стандарте),

Оператор сложения + (и все другие бинарные операторы) требует, чтобы оба операнда были rvalue, а результат был rvalue. И так далее...

Я проверил стандарт C++, и там четко сказано, что (пункт 3.10/2),

Всякий раз, когда значение gl появляется в в контексте, где ожидается значение pr, это значение преобразуется в pr-значение

(пункт 5/9),

Всякий раз, когда выражение glvalue появляется в качестве операнда оператора, который ожидает pr-значение для этого операнда, lvalue-to-rvalue (4.1), array-to-pointer (4.2), или функция-указатель (4.3) стандартные применяются стандартные преобразования для преобразования выражение в pr-значение.

Здесь используется термин, что операнд "ожидает" значение pr. Однако, когда я смотрю на оператор сложения, оператор умножения и т.д., там только упоминается, что результатом является pr-значение, но ничего не говорится о том, какими "ожидаются" операнды.

Действительно ли бинарный оператор ожидает, что операнды будут prvalue, имеет значение в следующем случае,

int b = 2;
int a = b + 1;

Если ожидается, что b будет prvalue, здесь будет преобразование lvalue в rvalue, а затем он выполнит prvalue + prvalue и вернет prvalue, а результат prvalue будет присвоен lvalue a.

Однако, если b не требуется быть prvalue, это будет lvalue + prvalue и результат будет prvalue.

Я действительно хочу знать, где в стандарте явно или неявно упоминается о том, что правила для различных операторов? Я проверил все разделы операторов, и только для нескольких операторов в стандарте явно указано, должны ли операнды и результаты быть lvalue или rvalue. Для большинства операторов стандарт упоминает только результат, но не требование к операнду.

Спасибо.


Кстати, я обнаружил, что в стандарте 5.19 относительно выражения константы может очень "неявно" подразумеваться, что бинарный оператор требует преобразования lvalue в rvalue для операндов. За более подробной информацией, пожалуйста, обратитесь к моему предыдущему вопросу,

смешивая использование constexpr и const?

Условное выражение является константным выражением, если только оно не включает в себя одно из значений. выражением, если оно не включает в себя одно из следующих потенциально оцениваемое подвыражение (3.2).

...

- преобразование l-значения в r-значение (4.1) если только оно не применяется к

---- значению типа интегрального или перечислительного типа, которое ссылается на энергонезависимый объект const с предшествующей инициализацией, инициализированному с помощью постоянного выражения

Спасибо за прочтение.

6
задан Community 23 May 2017 в 11:52
поделиться