Следующий код дурачится с указателем nullptr
и ссылкой:
#include <cstdio>
void printRefAddr(int &ref) {
printf("printAddr %p\n", &ref);
}
int main() {
int *ip = nullptr;
int &ir = *ip;
// 1. get address of nullptr reference
printf("ip=%p &ir=%p\n", ip, &ir);
// 2. dereference a nullptr pointer and pass it as reference
printRefAddr(*ip);
// 3. pass nullptr reference
printRefAddr(ir);
return 0;
}
Вопрос. Являются ли в стандартах C++ закомментированные операторы 1..3 действительным кодом или неопределенным поведением?
Является ли это одинаковым или разным для разных версий С++ (в более старых версиях, конечно, будет использоваться литерал 0
вместо ключевого слова nullptr
)?
Дополнительный вопрос: существуют ли известные варианты компиляторов/оптимизации, которые на самом деле могут привести к тому, что приведенный выше код сделает что-то неожиданное/сбой? Например, есть ли флаг для любого компилятора, который будет генерировать неявное утверждение для nullptr
везде, где инициализируется ссылка, включая передачу аргумента ссылки из *ptr
?
Пример вывода для любопытных, ничего неожиданного:
ip=(nil) &ir=(nil)
printAddr (nil)
printAddr (nil)
ip
в первый раз. - person Xeo   schedule 23.04.2013