Created on 1998-10-27.00:00:00 last changed 262 months ago
Proposed Resolution (10/00):
Add a new bullet to the list of restrictions in 6.7.3 [basic.life] paragraph 7, following the second bullet ("the new object is of the same type..."):
A reference is rebindable. This is surprising and unnatural. This can also cause subtle optimizer bugs.Example:
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.Proposal: make T& equivalent to T* const by extending the scope of 6.7.3 [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:
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 ); }
The proposed wording in the paper would still permit this usage and thus prevent an optimizer from eliminating the call to g().
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 |