Идентичнозначные указатели, сравнивающие неравные [дубликаты]

Это не только разница. К членам ArrayList можно получить доступ через индекс, например, обычные массивы, а также члены ArrayList могут легко отсортироваться в прямом и обратном порядке, а два ArrayList могут быть легко объединены, что не относится к простому списку. Подробнее см. В

http://www.cirvirlab.com/index.php/c-sharp-code-examples/112-c-sharp-arraylist-example.html

4
задан Community 23 May 2017 в 12:24
поделиться

1 ответ

Правильно ли, что существует некоторая двусмысленность относительно того, когда операторы равенства с указателями являются UB?

Нет, потому что этот отрывок из п. 6.5.9 (3):

Операторы == и != аналогичны реляционным операторам, за исключением их более низкого приоритета.

Предполагает, что из раздела 6.5.9 (6) также применяется к Операторы равенства:

При сравнении двух указателей [...] Во всех остальных случаях поведение не определено.

Если нет двусмысленности, когда точное сравнение указателей с операторами равенства будет UB?

Существует неопределенное поведение во всех случаях, для которых стандарт явно не определяет поведение.

Всегда ли UB, если at

§6.3.2.3 (5):

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

Что делать, если один указатель ссылается на память, которая была free d?

§6.2.4 (2):

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

можно сделать вывод, что никогда не существует UB в том смысле, что все «другие» сравнения должны давать false?

No. Стандарт определяет, при каких условиях два указателя должны сравнивать равные, и при каких условиях два указателя должны сравнивать не равные. Любое сравнение равенств между двумя указателями, которые выходят за пределы обоих этих двух наборов условий, вызывает неопределенное поведение.

Действительно ли в §6.5.9 (6) означает, что сравнение равенства бессмысленных, но поразрядных равных указателей всегда должно быть ложным ?

Нет, он не определен.

-1
ответ дан Oktalist 17 August 2018 в 17:26
поделиться
  • 1
    Будет ли downvoter следить за комментариями? – Oktalist 29 December 2016 в 17:16
  • 2
    Я не сторонник, но ваш ответ не может решить вопрос 6.5.9 / 6. Одна из критических моментов в вопросе заключается в том, следует ли расширить 6.5.9 / 6 применимость сравнений сравнений, выходящих за рамки разрешенных для реляционных сравнений. Кажется, вы утверждаете, что 6.5.9 / 3 козыри 6.5.9 / 6. Это не убедительно. – AnT 10 July 2018 в 23:46
  • 3
    Не уменьшалось, но == и !=, попадающие в сравнительные операторы для целей п. 6.5.9 (6), являются наиболее неубедительными. §6.5.8 (5) (При сравнении двух указателей ...) находится в операциях Relational (не включает == и! =), Аналогично мне не следует применять § 6.5.5 (5), и если равенство-сравнение несвязанных объектов было UB, тогда такие вещи, как сравнение fn-указателей, были бы UB, что кажется сомнительным. – PSkocik 11 July 2018 в 00:11
  • 4
    Авторы Стандарта признают возможность реализации, которые соответствуют, но имеют такое низкое качество, что практически бесполезны. Я лично не стал бы читать Стандарт как предоставление полного разрешения для совместимых, но бесполезных реализаций, чтобы сравнение сравнений между несвязанными указателями делало что-то отличное от результата 0 или 1, но может принять, что почетные люди могут читать его по-другому. С другой стороны, я не понимаю, почему кто-то, кто не пытается подорвать язык, должен попытаться использовать это оправдание для «оптимизации». – supercat 11 July 2018 в 19:31
Другие вопросы по тегам:

Похожие вопросы: