Brian Silverman | af2eaa8 | 2018-08-04 17:28:31 -0700 | [diff] [blame^] | 1 | |
| 2 | [section Relational operators] |
| 3 | |
| 4 | Type `optional<T>` is __SGI_EQUALITY_COMPARABLE__ whenever `T` is __SGI_EQUALITY_COMPARABLE__. Two optional objects containing a value compare in the same way as their contained values. The uninitialized state of `optional<T>` is treated as a distinct value, equal to itself, and unequal to any value of type `T`: |
| 5 | |
| 6 | boost::optional<int> oN = boost::none; |
| 7 | boost::optional<int> o0 = 0; |
| 8 | boost::optional<int> o1 = 1; |
| 9 | |
| 10 | assert(oN != o0); |
| 11 | assert(o1 != oN); |
| 12 | assert(o0 != o1); |
| 13 | assert(oN == oN); |
| 14 | assert(o0 == o0); |
| 15 | |
| 16 | The converting constructor from `T` as well as from `boost::none` implies the existence and semantics of the mixed comparison between `T` and `optional<T>` as well as between `none_t` and `optionl<T>`: |
| 17 | |
| 18 | assert(oN != 0); |
| 19 | assert(o1 != boost::none); |
| 20 | assert(o0 != 1); |
| 21 | assert(oN == boost::none); |
| 22 | assert(o0 == 0); |
| 23 | |
| 24 | This mixed comparison has a practical interpretation, which is occasionally useful: |
| 25 | |
| 26 | boost::optional<int> choice = ask_user(); |
| 27 | if (choice == 2) |
| 28 | start_procedure_2(); |
| 29 | |
| 30 | In the above example, the meaning of the comparison is 'user chose number 2'. If user chose nothing, he didn't choose number 2. |
| 31 | |
| 32 | In case where `optional<T>` is compared to `none`, it is not required that `T` be __SGI_EQUALITY_COMPARABLE__. |
| 33 | |
| 34 | In a similar manner, type `optional<T>` is __SGI_LESS_THAN_COMPARABLE__ whenever `T` is __SGI_LESS_THAN_COMPARABLE__. The optional object containing no value is compared less than any value of `T`. To illustrate this, if the default ordering of `size_t` is {`0`, `1`, `2`, ...}, the default ordering of `optional<size_t>` is {`boost::none`, `0`, `1`, `2`, ...}. This order does not have a practical interpretation. The goal is to have any semantically correct default ordering in order for `optional<T>` to be usable in ordered associative containers (wherever `T` is usable). |
| 35 | |
| 36 | Mixed relational operators are the only case where the contained value of an optional object can be inspected without the usage of value accessing function (`operator*`, `value`, `value_or`). |
| 37 | [endsect] |