On 27 January 2014 20:12, Marc Glisse wrote: > On Mon, 27 Jan 2014, Jonathan Wakely wrote: > >> This is the best I've come up with to avoid dereferencing an invalid >> pointer when calling vector::data() on an empty vector. >> >> For C++03 we reurn the vector's pointer type, so can just return the >> internal pointer, but for C++11 we need to convert that to a raw >> pointer, which we do by dereferencing, so we must check if it's valid >> first. > > > For comparison, libc++ has 2 paths. If pointer really is a pointer, it just > returns it, no need to pay for a comparison in that case. And otherwise, it > calls _M_start.operator-> and crosses its fingers. There is a helper > function doing that used throughout the library.
Ah yes, I remember Howard posting a get_raw_pointer() function to the reflector that used operator->() on user-defined types ... I don't really like calling that on a potentially invalid pointer though. The user-defined pointer type in my new testcase could just as easily throw if operator-> is called on an invalid pointer. As Paolo also mentioned avoiding the branch for built-in pointers I'll do that. (Sorry for the double-post, the first one seemed to disappear and I wasn't sure if it really happened or not, so wrote it again!)