- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
#include <iostream>
using namespace std;
struct RefStruct {
RefStruct(int &ref) :
m_ref(ref)
{}
int getRefValue() const {
return m_ref;
}
private:
int &m_ref;
};
int main(int argc, char *argv[]) {
int a = 0xa;
int b = 0xb;
RefStruct s(a);
RefStruct *p = &s;
*(reinterpret_cast<int **>(p)) = &b;
cout << "RefValue: " << hex << s.getRefValue() << endl;
return 0;
}
С другом разговаривали - как бы получить указатель на ссылку.
Как вы думаете, что будет на выхлопе?
s.getRefValue() == 0xA
А чего вы ожидали? Значение m_ref изменяется только в конструкторе!
Кому лень копипастить проверять:
http://ideone.com/7dRGP
3. It is unspecified whether or not a reference requires storage
4. There shall be no references to references, no arrays of references, and no pointers to references.
Только что вы убедились, что UB это действительно UB - с другим компилятором, с другими опциями, с немного другим кодом, результатом вполне могло быть и 0x0B.
P.S. А вот выше Elvenfighter и показал вторую сторону этого UB'а.
Вот так вот через пару лет не на чем будет показать, что ситуация в топике - UB ;(
P.S. Попутно заметил, что конструкцию for (int i=0; i<1000; i++) { pp += i*10; } gcc умудряется откомпилить в addl $4995000, %eax...