| Home | Libraries | People | FAQ | More

### 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;
    }