Какова цель фразы «if x is an object» в [basic.def.odr] / 3?

[basic.def.odr] / 3:

Переменная x, имя которой появляется как потенциально оцениваемое выражение ex, используется ex в odr, если только применение преобразования lvalue-to-rvalue (4.1) к x не дает постоянного выражения (5.20), которое не вызывает никаких нетривиальных функций и , если x является объектом, ex является элементом набора потенциальных результатов выражения e, где либо преобразование lvalue-to-rvalue (4.1) применяется к e, либо e является выражение отброшенного значения (раздел 5). ...

Почему в текст выше включено дополнительное условие «если x - объект»?


person João Afonso    schedule 12.03.2017    source источник
comment
В отличие от ссылки?   -  person yuri kilochek    schedule 12.03.2017
comment
Помимо ссылок, другими типами, не являющимися объектами, являются функции и void. См. howardhinnant.github.io/TypeHiearchy.pdf для графического изображения системы классификации типов.   -  person Howard Hinnant    schedule 14.03.2017


Ответы (2)


x - это переменная. Но переменные не обязательно должны быть объектами. Они также могут быть ссылками. Ссылки - это ссылки на объекты, но сама ссылка не является объектом (в отличие от указателей, которые являются объектами, а также потенциально указывают на объект).

Таким образом, в заявлении проводится различие между переменными, которые объявляют объекты, и переменными, которые объявляют ссылки на объект.

person Nicol Bolas    schedule 12.03.2017
comment
Таким образом, вы в основном говорите, что если x является ссылкой, вам не нужно проверять оставшуюся часть абзаца, чтобы определить, используется ли x odr или нет. Это идея? - person João Afonso; 12.03.2017

В тексте есть два требования, которые должны быть выполнены для того, чтобы переменная x не использовалась odr. Вот эти требования:

  1. # P2 #

А также

  1. # P4 #

Формулировка неудобная, но второй пункт - логичное условие: P --> Q. Логические условные выражения являются ложными, только если оба P равно true и Q равноfalse. Если P равно false, условное выражение по-прежнему равно true. В этом случае посылкой «если x является объектом» является false, если x является ссылкой. В этом случае все требование оценивается как истинное.

Другими словами, если x является ссылкой, она используется odr, если только применение преобразования lvalue-to-rvalue (4.1) к x не дает постоянного выражения (5.20), которое не вызывает никаких нетривиальных функций. Вот и все. Даже если ex было выражением отбрасываемого значения, x все равно использовалось бы odr, если бы это была ссылка.

person Barry    schedule 12.03.2017
comment
Отличный ответ! (+1) Even if e is a discarded-value expression, x would still be odr-used if it were a reference. Разве это не странно? - person João Afonso; 12.03.2017
comment
Я не уверен, что вы имеете в виду под последним предложением. В эталонном случае нет e. - person T.C.; 04.04.2017
comment
@ T.C. Я имею в виду, что если у вас есть выражение отброшенного значения со ссылкой, оно все равно используется odr. Просто подчеркну, что эта часть не относится к ссылкам. - person Barry; 04.04.2017
comment
Какое отношение имеет выражение отброшенного значения к контрольному случаю? Если x является ссылкой, то №2 тривиально удовлетворяется. Обратите внимание, что №1 не требует, чтобы выражение, в котором появляется x, фактически применяло l-to-r к x. - person T.C.; 04.04.2017
comment
Но посмотрите основные проблемы 2083 и 2103. Этот текст беспорядочный. - person T.C.; 04.04.2017
comment
@ T.C. Это то, что я говорю, это не так. Я просто делаю акцент. Формулировка излишне непрозрачна, и я пытаюсь разными способами объяснить, что означает №2. - person Barry; 04.04.2017