Re: nullptr reference legal?
Jim Langston wrote:
I wound up creating a null reference on accident using polymorphism and
wondered if this snippet is legal code, as it compiles and works as I
would expect it to work.
void jglRenderModel( jglModel& model ) {
if ( &model == nullptr ) {
return;
}
/* ... */
}
This code is valid. However, it makes no sense since &model must not be
NULL.
// Following line may produce a nullptr reference
jglRenderModel( *dynamic_cast<jmlGL::jglModel*>((world.objects.find(
L"Cube" ))->second) );
This code is invalid if and only if the dynamic cast returns nullptr
since you must not dereference a nullptr.
// Following line will produce a nullptr reference
jglRenderModel( *reinterpret_cast<jmlGL::jglModel*>( nullptr ) );
This code is always invalid.
And no, these are not only restrictions of the language, it will really
produce invalid machine code. The following example will behave
unexpected on many platforms:
struct A
{ int a;
};
struct B
{ int b;
};
struct C : public A, public B
{ int c;
};
C* cptr = NULL;
C& cref = *cptr; // invalid, but usually here nothing strange happens
B& bref = cref; // Now the nullptr turns into something not null.
assert(&bref == NULL); // Fail!
If a reference type conversion requires an adjustment of the offset, it
is, in contrast to pointer types, not checked for NULL before. This
implies also that the use of references instead of pointers that must
not be NULL might have a performance gain with polymorphic types,
because of the omitted NULL checks.
Marcel