int &r1 = r1; // r1 0 initialized, `r1` references 0, not UB? int *p1 = p1; // p1 0 initialized, `p1` is a null ptr, not UB? int main() { int &r2 = r2; // reference to intermediate value. has UB ? int &r3 = r2; // Also has UB ? int *p2 = p2; // pointer to garbage location. has UB ? int *p3 = p2; // Also has UB ? return 0; }
Оценка неинициализированного указателя вызывает неопределенное поведение: Где именно стандарт C ++ говорит, что разыменование неинициализированного указателя является неопределенным поведением?
Но оцениваются ли указанные выше указатели / ссылки?
В этом вопросе я хотел спросить о следующих случаях:
- Назначение ссылки на себя в области видимости файла и области блока.
- Назначение указателя самому себе в области видимости файла и области блока.
- Назначение неинициализированной ссылки другой ссылке.
- Назначение неинициализированного указателя другому указателю.
Он компилируется? — person Dan schedule 15.06.2021
Да, но может выдавать предупреждения, как и ожидалось. — person Dan schedule 15.06.2021
Я получаю интересный результат для эталонной самоинициализации в области пространства имен — live — godbolt.org/z/W84nW5GYY Все компиляторы обнаруживают это, если объявление является локальным. — person Dan schedule 15.06.2021
Что вы пытаетесь достичь? Это просто упражнение в непонятных причудах C ++? — person Dan schedule 15.06.2021
@KamilCuk извините за опечатку, она исправлена. — person Dan schedule 15.06.2021
Применима ли такая причуда только к указателям и ссылкам? Например, я не думаю, что int a = a; разрешено. — person Dan schedule 15.06.2021
@tobias разрешено. подробнее об этом: stackoverflow.com/questions/67979228/ — person Dan schedule 15.06.2021
@Dan Разрешенный ответ относится только к int i = i;, а не int a = a;, который находится в другом контексте. Разница в продолжительности хранения. В этом отношении нет разницы между int и указателем. — person Dan schedule 15.06.2021
Источник: