Какова категория значений операндов операторов C ++, когда они не указаны?

ПОМЕЩЕНИЕ:

Стандарт C ++ 11 classифицирует выражения в три непересекающиеся категории значений : lvalues , xvalues и prvalues (§ 3.10 / 1). Например, здесь объясняется, какие категории значений доступны.

Я изо всех сил пытаюсь выяснить, каковы требования различных операторов к категории значений их операндов. В пункте 3.10 / 1 указывается:

[…] Каждое выражение относится к одной из фундаментальных classификаций в этой таксономии: lvalue, xvalue или prvalue. Это свойство выражения называется его категорией значений. [Примечание: обсуждение каждого встроенного оператора в разделе 5 указывает категорию значения, которое оно дает, и категории значений для операндов, которые он ожидает . Например, встроенные операторы присваивания ожидают, что левый операнд будет lvalue и что правый операнд является prvalue и дает результат lvalue в качестве результата . Определяемые пользователем операторы являются функциями, а категории ожидаемых значений и доходности определяются их параметрами и типами возврата. -End note]

Несмотря на то, что вышеприведенная нота, пункт 5 не всегда очень четко относится к категории значений операндов операторов. Это, например, все, что сказано о категории значений операндов оператора присваивания (параграф 5.17 / 1):

Оператор присваивания (=) и составные операторы присваивания все группы справа налево. Все они требуют модифицируемого lvalue в качестве своего левого операнда и возвращают lvalue, ссылаясь на левый операнд . Результатом во всех случаях является бит-поле, если левым операндом является бит-поле. Во всех случаях назначение упорядочивается после вычисления значения правого и левого операндов и перед вычислением значения выражения присваивания. Что касается вызова функции с неопределенной последовательностью, то операция составного присвоения представляет собой единую оценку. [Примечание: поэтому вызов функции не должен вмешиваться между преобразованием lvalue-to-rval и побочным эффектом, связанным с любым единственным оператором присваивания. -End note]

Как насчет правильных операндов?

Слова «rvalue» и «lvalue» больше не встречаются во всем разделе 5.17. Хотя в примечании в параграфе 3.10 / 1 четко указывается, что встроенные операторы присваивания ожидают prvalue как правый операнд, это явно не упоминается в разделе 5.17. Даже последнее замечание 5.17 / 1, в котором упоминаются преобразования lvalue-to-rvalue, похоже, подразумевает, что rvalues ​​ожидаются каким-то образом (в чем же необходимость преобразования в противном случае?), Но примечания в любом случае не являются нормативными.

Разделы, относящиеся к другим операторам, включая мультипликативные и аддитивные операторы, обычно молчат в категории значений их операндов. Я не смог найти «стандартную инструкцию» в Стандарте, заявив, что, если не указано иное, операнды встроенных операторов имеют значения r. Следовательно, вопрос.

ВОПРОС:

  1. Какова категория значений правильного операнда оператора присваивания ; и, в более общем плане
  2. Как определить категорию значения операнда оператора, если это не указано ? Является ли это безусловным (что означает, что любая категория ценностей принимается)? Если да, то почему преобразования lvalue-to-rvalue когда-либо применяются в выражении присваивания?

Ссылки на стандарт C ++ 11 высоко ценятся.

Да, он плохо указан и ранее был рассмотрен . В принципе, каждый раз, когда требуется выражение lvalue, перечисляется, поэтому мы предполагаем, что каждый другой операнд должен быть выражением prvalue.

Поэтому, чтобы ответить на ваши вопросы:

  1. Значение.
  2. Если это не указано, это значение.

Заметка, указанная в связанном ответе, кажется, несколько раз изменилась. Цитата из §3.10 стандарта C ++ 11 выглядит следующим образом (и в текущее время в последнем черновике):

[Примечание: обсуждение каждого встроенного оператора в разделе 5 указывает категорию значения, которое оно дает, и категории значений для операндов, которые он ожидает. Например, встроенные операторы присваивания ожидают, что левый операнд будет lvalue и что правый операнд является prvalue и дает результат lvalue в качестве результата. Определяемые пользователем операторы являются функциями, а категории ожидаемых значений и доходности определяются их параметрами и типами возврата. – конечная нота]

Здесь он даже явно говорит, что операторы присваивания ожидают, что правый операнд будет значением prvalue. Конечно, это примечание и поэтому является ненормативным.

Давайте будем гением компьютера.