- Title
- Object lifetime does not account for reference rebinding
- Status
- tc1
- Section
- 6.8.4 [basic.life]
- Submitter
- AFNOR
Created on 1998-10-27.00:00:00 last changed 284 months ago
Messages
Date: 2000-10-15.00:00:00
Proposed Resolution (10/00): Add a new bullet to the list of restrictions in
6.8.4 [basic.life] paragraph 7,
following the second bullet ("the new object is of the same
type..."):
Date: 2026-07-25.21:52:10
From J16/98-0026 = WG21 N1169, "Proposed Defect Reports on ISO/IEC
14882, Programming Languages - C++":
Example: Proposal: make T& equivalent to T* const by extending
the scope of
6.8.4 [basic.life]
paragraph
9 to references. (See also J16/99-0005 = WG21 N1182, "Proposed Resolutions for Core
Language Issues 6, 14, 20, 40, and 89") In addition, Lisa Lippincott pointed out the following example: The proposed wording in the paper would still permit this usage and
thus prevent an optimizer from eliminating the call to g() .
A reference is rebindable. This is surprising and unnatural. This can
also cause subtle optimizer bugs.
struct T {
int& ri;
T (int& r) : ri (r) { }
};
void bar (T*);
void foo () {
int i;
T x (i);
x.ri = 3; // the optimizer understands that this is really i = 3
bar (&x);
x.ri = 4; // optimizer assumes that this writes to i, but this is incorrect
}
int gi;
void bar (T* p) {
p->~T ();
new (p) T (gi);
}
If we replace T& with T* const in the example then
undefined behavior result and the optimizer is correct.
void f( const bool * );
void g();
int main() {
const bool *b = new const bool( false );
f(b);
if (*b)
g();
}
void f( const bool *b ) {
new ( const_cast<bool *>(b) ) const bool( true );
}
| History | |||
|---|---|---|---|
| Date | User | Action | Args |
| 2003-04-25 00:00:00 | admin | set | status: dr -> tc1 |
| 2000-11-18 00:00:00 | admin | set | messages: + msg441 |
| 2000-11-18 00:00:00 | admin | set | status: ready -> dr |
| 2000-05-21 00:00:00 | admin | set | status: drafting -> ready |
| 1998-10-27 00:00:00 | admin | create | |