Boost C++ Libraries

...one of the most highly regarded and expertly designed C++ library projects in the world. Herb Sutter and Andrei Alexandrescu, C++ Coding Standards

This is the documentation for an old version of Boost. Click here to view this page for the latest version.
PrevUpHomeNext

Optional Reference Binding

On compilers that do not conform to Standard C++ rules of reference binding, operations on optional references might give adverse results: rather than binding a reference to a designated object they may create an unexpected temporary and bind to it. Compilers known to have these deficiencies include GCC versions 4.2, 4.3, 4.4, 4.5; QCC 4.4.2; MSVC versions 8.0, 9.0, 10.0, 11.0, 12.0. On these compilers prefer using direct-initialization and copy assignment of optional references to copy-initialization and assignment from T&:

const int i = 0;
optional<const int&> or1;
optional<const int&> or2 = i;  // not portable
or1 = i;                       // not portable

optional<const int&> or3(i);   // portable
or1 = optional<const int&>(i); // portable

In order to check if your compiler correctly implements reference binding use this test program.

#include <cassert>

const int global_i = 0;

struct TestingReferenceBinding
{
  TestingReferenceBinding(const int& ii)
  {
    assert(&ii == &global_i);
  }

  void operator=(const int& ii)
  {
    assert(&ii == &global_i);
  }

  void operator=(int&&) // remove this if your compiler doesn't have rvalue refs
  {
    assert(false);
  }
};

int main()
{
  const int& iref = global_i;
  assert(&iref == &global_i);

  TestingReferenceBinding ttt = global_i;
  ttt = global_i;

  TestingReferenceBinding ttt2 = iref;
  ttt2 = iref;
}

PrevUpHomeNext