You shouldn't rely on undefined behaviour. Look what the compiler does with your code, particularly the last part:
    cout<<&a<<" = "<<a;
  b6:   48 8d 45 ac             lea    -0x54(%rbp),%rax
  ba:   48 89 c2                mov    %rax,%rdx
  bd:   48 8b 0d 00 00 00 00    mov    0x0(%rip),%rcx        # c4 <main+0xc4>
  c4:   e8 00 00 00 00          callq  c9 <main+0xc9>
  c9:   48 8d 15 00 00 00 00    lea    0x0(%rip),%rdx        # d0 <main+0xd0>
  d0:   48 89 c1                mov    %rax,%rcx
  d3:   e8 00 00 00 00          callq  d8 <main+0xd8>
  d8:   ba 05 00 00 00          mov    $0x5,%edx   <=== direct insert of 5 in the register to display 5
  dd:   48 89 c1                mov    %rax,%rcx
  e0:   e8 00 00 00 00          callq  e5 <main+0xe5>
    return 0;
  e5:   b8 00 00 00 00          mov    $0x0,%eax
  ea:   90                      nop
  eb:   48 83 c4 48             add    $0x48,%rsp
  ef:   5b                      pop    %rbx
  f0:   5d                      pop    %rbp
  f1:   c3                      retq
When the compiler sees a constant expression, it can decide (implementation-dependent) to replace it with the actual value.
In that particular case, g++ did that without even -O1 option!