...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
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; }