- 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;
}
С другом разговаривали - как бы получить указатель на ссылку.
Как вы думаете, что будет на выхлопе?
Fai 15.07.2012 16:43 # +2
s.getRefValue() == 0xA
А чего вы ожидали? Значение m_ref изменяется только в конструкторе!
Кому лень копипастить проверять:
http://ideone.com/7dRGP
Elvenfighter 15.07.2012 16:55 # +1
Elvenfighter 15.07.2012 17:01 # +1
bormand 15.07.2012 16:57 # +4
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'а.
bormand 15.07.2012 17:46 # +5
Вот так вот через пару лет не на чем будет показать, что ситуация в топике - UB ;(
P.S. Попутно заметил, что конструкцию for (int i=0; i<1000; i++) { pp += i*10; } gcc умудряется откомпилить в addl $4995000, %eax...
TarasB 15.07.2012 17:55 # +1
Fai 15.07.2012 18:10 # +3
bormand 15.07.2012 18:13 # +3
sayidandrtfm 15.07.2012 18:19 # +9
rat4 15.07.2012 18:53 # +2