mirror of
https://github.com/boostorg/optional.git
synced 2025-07-22 00:32:09 +02:00
fixed broken links to SGI docs
This commit is contained in:
@ -38,10 +38,10 @@ Distributed under the Boost Software License, Version 1.0.
|
|||||||
[/ Other web resources ]
|
[/ Other web resources ]
|
||||||
|
|
||||||
[def __HASKELL__ [@http://www.haskell.org/ Haskell]]
|
[def __HASKELL__ [@http://www.haskell.org/ Haskell]]
|
||||||
[def __SGI_DEFAULT_CONSTRUCTIBLE__ [@http://www.sgi.com/tech/stl/DefaultConstructible.html `DefaultConstructible`]]
|
[def __STD_DEFAULT_CONSTRUCTIBLE__ [@https://en.cppreference.com/w/cpp/named_req/DefaultConstructible `DefaultConstructible`]]
|
||||||
[def __SGI_LESS_THAN_COMPARABLE__ [@http://www.sgi.com/tech/stl/LessThanComparable.html `LessThanComparable`]]
|
[def __STD_LESS_THAN_COMPARABLE__ [@https://en.cppreference.com/w/cpp/named_req/LessThanComparable `LessThanComparable`]]
|
||||||
[def __SGI_EQUALITY_COMPARABLE__ [@http://www.sgi.com/tech/stl/EqualityComparable.html `EqualityComparable`]]
|
[def __STD_EQUALITY_COMPARABLE__ [@https://en.cppreference.com/w/cpp/named_req/EqualityComparable `EqualityComparable`]]
|
||||||
[def __SGI_GENERATOR__ [@http://www.sgi.com/tech/stl/Generator.html `Generator`]]
|
[def __SGI_GENERATOR__ [@http://www.rrsd.com/software_development/stl/stl/Generator.html `Generator`]]
|
||||||
|
|
||||||
|
|
||||||
[/ Icons ]
|
[/ Icons ]
|
||||||
|
@ -114,7 +114,7 @@ Suppose we want to implement a ['lazy load] optimization. This is because we do
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
`optional`'s default constructor creates an uninitialized optional. No call to `Resource`'s default constructor is attempted. `Resource` doesn't have to be __SGI_DEFAULT_CONSTRUCTIBLE__. In function `getResource` we first check if `resource_` is initialized. This time we do not use the contextual conversion to `bool`, but a comparison with `boost::none`. These two ways are equivalent. Function `emplace` initializes the optional in-place by perfect-forwarding the arguments to the constructor of `Resource`. No copy- or move-construction is involved here. `Resource` doesn't even have to be `MoveConstructible`.
|
`optional`'s default constructor creates an uninitialized optional. No call to `Resource`'s default constructor is attempted. `Resource` doesn't have to be __STD_DEFAULT_CONSTRUCTIBLE__. In function `getResource` we first check if `resource_` is initialized. This time we do not use the contextual conversion to `bool`, but a comparison with `boost::none`. These two ways are equivalent. Function `emplace` initializes the optional in-place by perfect-forwarding the arguments to the constructor of `Resource`. No copy- or move-construction is involved here. `Resource` doesn't even have to be `MoveConstructible`.
|
||||||
|
|
||||||
[note Function `emplace` is only available on compilers that support rvalue references and variadic templates. If your compiler does not support these features and you still need to avoid any move-constructions, use [link boost_optional.tutorial.in_place_factories In-Place Factories].]
|
[note Function `emplace` is only available on compilers that support rvalue references and variadic templates. If your compiler does not support these features and you still need to avoid any move-constructions, use [link boost_optional.tutorial.in_place_factories In-Place Factories].]
|
||||||
|
|
||||||
@ -150,9 +150,11 @@ Suppose you want to ask users to choose some number (an `int`). One of the valid
|
|||||||
++choices[choice];
|
++choices[choice];
|
||||||
}
|
}
|
||||||
|
|
||||||
This works because `optional<T>` is __SGI_LESS_THAN_COMPARABLE__ whenever `T` is __SGI_LESS_THAN_COMPARABLE__. In this case the state of being uninitialized is treated as a yet another value of `T`, which is compared less than any value of `T`.
|
This works because `optional<T>` is __STD_LESS_THAN_COMPARABLE__ whenever `T` is __STD_LESS_THAN_COMPARABLE__.
|
||||||
|
In this case the state of being uninitialized is treated as a yet another value of `T`,
|
||||||
|
which is compared less than any value of `T`.
|
||||||
|
`optional<T>` can also be stored as a key in `std::unordered_map` and `std::unordered_set`
|
||||||
|
as it provides specializations for `std::hash`.
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@ Here, having received an empty `vec` and having no `size_t` to return is not a [
|
|||||||
|
|
||||||
Another typical situation is to indicate that we do not have a value yet, but we expect to have it later. This notion can be used in implementing solutions like lazy initialization or a two-phase initialization.
|
Another typical situation is to indicate that we do not have a value yet, but we expect to have it later. This notion can be used in implementing solutions like lazy initialization or a two-phase initialization.
|
||||||
|
|
||||||
`optional` can be used to take a non-__SGI_DEFAULT_CONSTRUCTIBLE__ type `T` and create a sibling type with a default constructor. This is a way to add a ['null-state] to any type that doesn't have it already.
|
`optional` can be used to take a non-__STD_DEFAULT_CONSTRUCTIBLE__ type `T` and create a sibling type with a default constructor. This is a way to add a ['null-state] to any type that doesn't have it already.
|
||||||
|
|
||||||
Sometimes type `T` already provides a built-in null-state, but it may still be useful to wrap it into `optional`. Consider `std::string`. When you read a piece of text from a GUI form or a DB table, it is hardly ever that the empty string indicates anything else but a missing text. And some data bases do not even distinguish between a null string entry and a non-null string of length 0. Still, it may be practical to use `optional<string>` to indicate in the returned type that we want to treat the empty string in a special dedicated program path:
|
Sometimes type `T` already provides a built-in null-state, but it may still be useful to wrap it into `optional`. Consider `std::string`. When you read a piece of text from a GUI form or a DB table, it is hardly ever that the empty string indicates anything else but a missing text. And some data bases do not even distinguish between a null string entry and a non-null string of length 0. Still, it may be practical to use `optional<string>` to indicate in the returned type that we want to treat the empty string in a special dedicated program path:
|
||||||
|
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
|
|
||||||
[section Relational operators]
|
[section Relational operators]
|
||||||
|
|
||||||
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`:
|
Type `optional<T>` is __STD_EQUALITY_COMPARABLE__ whenever `T` is __STD_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`:
|
||||||
|
|
||||||
boost::optional<int> oN = boost::none;
|
boost::optional<int> oN = boost::none;
|
||||||
boost::optional<int> o0 = 0;
|
boost::optional<int> o0 = 0;
|
||||||
@ -29,9 +29,9 @@ This mixed comparison has a practical interpretation, which is occasionally usef
|
|||||||
|
|
||||||
In the above example, the meaning of the comparison is 'user chose number 2'. If user chose nothing, he didn't choose number 2.
|
In the above example, the meaning of the comparison is 'user chose number 2'. If user chose nothing, he didn't choose number 2.
|
||||||
|
|
||||||
In case where `optional<T>` is compared to `none`, it is not required that `T` be __SGI_EQUALITY_COMPARABLE__.
|
In case where `optional<T>` is compared to `none`, it is not required that `T` be __STD_EQUALITY_COMPARABLE__.
|
||||||
|
|
||||||
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).
|
In a similar manner, type `optional<T>` is __STD_LESS_THAN_COMPARABLE__ whenever `T` is __STD_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).
|
||||||
|
|
||||||
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`).
|
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`).
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@ -66,7 +66,7 @@ Quite a lot of people expect that when an object that contains a value is moved
|
|||||||
|
|
||||||
[section Mixed relational comparisons]
|
[section Mixed relational comparisons]
|
||||||
|
|
||||||
Because `T` is convertible to `optional<T>` and because `optional<T>` is __SGI_LESS_THAN_COMPARABLE__ when `T` is __SGI_LESS_THAN_COMPARABLE__,
|
Because `T` is convertible to `optional<T>` and because `optional<T>` is __STD_LESS_THAN_COMPARABLE__ when `T` is __STD_LESS_THAN_COMPARABLE__,
|
||||||
you can sometimes get an unexpected runtime result where you would rather expect a compiler error:
|
you can sometimes get an unexpected runtime result where you would rather expect a compiler error:
|
||||||
|
|
||||||
optional<double> Flight_plan::weight(); // sometimes no weight can be returned
|
optional<double> Flight_plan::weight(); // sometimes no weight can be returned
|
||||||
|
@ -33,6 +33,6 @@ If `T` is `Moveable` (both __MOVE_CONSTRUCTIBLE__ and `MoveAssignable`) then `op
|
|||||||
|
|
||||||
Similarly, if `T` is `Copyable` (both __COPY_CONSTRUCTIBLE__ and `CopyAssignable`) then `optional<T>` is also `Copyable` and additionally can be constructed and assigned from an lvalue of type `T`.
|
Similarly, if `T` is `Copyable` (both __COPY_CONSTRUCTIBLE__ and `CopyAssignable`) then `optional<T>` is also `Copyable` and additionally can be constructed and assigned from an lvalue of type `T`.
|
||||||
|
|
||||||
`T` ['is not] required to be __SGI_DEFAULT_CONSTRUCTIBLE__.
|
`T` ['is not] required to be __STD_DEFAULT_CONSTRUCTIBLE__.
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
@ -66,7 +66,7 @@ __SPACE__
|
|||||||
std::basic_ostream<CharType, CharTrait>&` [br]
|
std::basic_ostream<CharType, CharTrait>&` [br]
|
||||||
operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v);`
|
operator>>(std::basic_istream<CharType, CharTrait>& in, optional<T>& v);`
|
||||||
|
|
||||||
* [*Requires:] `T` is __SGI_DEFAULT_CONSTRUCTIBLE__ and __MOVE_CONSTRUCTIBLE__.
|
* [*Requires:] `T` is __STD_DEFAULT_CONSTRUCTIBLE__ and __MOVE_CONSTRUCTIBLE__.
|
||||||
* [*Effect:] Reads the value of optional object from `in`. If the string representation indicates that the optional object should contain a value, `v` contains a value and its contained value is obtained as if by default-constructing an object `o` of type `T` and then calling `in >> o`; otherwise `v` does not contain a value, and the previously contained value (if any) has been destroyed.
|
* [*Effect:] Reads the value of optional object from `in`. If the string representation indicates that the optional object should contain a value, `v` contains a value and its contained value is obtained as if by default-constructing an object `o` of type `T` and then calling `in >> o`; otherwise `v` does not contain a value, and the previously contained value (if any) has been destroyed.
|
||||||
* [*Returns:] `out`.
|
* [*Returns:] `out`.
|
||||||
|
|
||||||
|
@ -1216,7 +1216,7 @@ __SPACE__
|
|||||||
|
|
||||||
[: `bool operator == ( optional<T> const& x, optional<T> const& y );`]
|
[: `bool operator == ( optional<T> const& x, optional<T> const& y );`]
|
||||||
|
|
||||||
* [*Requires:] `T` shall meet requirements of __SGI_EQUALITY_COMPARABLE__.
|
* [*Requires:] `T` shall meet requirements of __STD_EQUALITY_COMPARABLE__.
|
||||||
* [*Returns:] If both `x` and `y` are initialized, `(*x == *y)`. If only
|
* [*Returns:] If both `x` and `y` are initialized, `(*x == *y)`. If only
|
||||||
`x` or `y` is initialized, `false`. If both are uninitialized, `true`.
|
`x` or `y` is initialized, `false`. If both are uninitialized, `true`.
|
||||||
* [*Notes:] This definition guarantees that `optional<T>` not containing a value is compared unequal to any `optional<T>` containing any value, and equal to any other `optional<T>` not containing a value.
|
* [*Notes:] This definition guarantees that `optional<T>` not containing a value is compared unequal to any `optional<T>` containing any value, and equal to any other `optional<T>` not containing a value.
|
||||||
@ -1249,7 +1249,7 @@ __SPACE__
|
|||||||
* [*Returns:] `(!y) ? false : (!x) ? true : *x < *y`.
|
* [*Returns:] `(!y) ? false : (!x) ? true : *x < *y`.
|
||||||
* [*Notes:] This definition guarantees that `optional<T>` not containing a value is ordered as less than any `optional<T>` containing any value, and equivalent to any other `optional<T>` not containing a value.
|
* [*Notes:] This definition guarantees that `optional<T>` not containing a value is ordered as less than any `optional<T>` containing any value, and equivalent to any other `optional<T>` not containing a value.
|
||||||
Pointers have shallow relational operators while `optional` has deep relational operators. Do not use `operator<` directly in generic code
|
Pointers have shallow relational operators while `optional` has deep relational operators. Do not use `operator<` directly in generic code
|
||||||
which expect to be given either an `optional<T>` or a pointer; use __FUNCTION_LESS_POINTEES__ instead. `T` need not be __SGI_LESS_THAN_COMPARABLE__. Only single `operator<` is required. Other relational operations are defined in terms of this one. If `T`'s `operator<` satisfies the axioms of __SGI_LESS_THAN_COMPARABLE__ (transitivity, antisymmetry and irreflexivity), `optinal<T>` is __SGI_LESS_THAN_COMPARABLE__.
|
which expect to be given either an `optional<T>` or a pointer; use __FUNCTION_LESS_POINTEES__ instead. `T` need not be __STD_LESS_THAN_COMPARABLE__. Only single `operator<` is required. Other relational operations are defined in terms of this one. If `T`'s `operator<` satisfies the axioms of __STD_LESS_THAN_COMPARABLE__ (transitivity, antisymmetry and irreflexivity), `optinal<T>` is __STD_LESS_THAN_COMPARABLE__.
|
||||||
* [*Example:]
|
* [*Example:]
|
||||||
``
|
``
|
||||||
optional<T> oN, oN_;
|
optional<T> oN, oN_;
|
||||||
@ -1310,7 +1310,7 @@ __SPACE__
|
|||||||
[: `bool operator == ( none_t, optional<T> const& x ) noexcept;`]
|
[: `bool operator == ( none_t, optional<T> const& x ) noexcept;`]
|
||||||
|
|
||||||
* [*Returns:] `!x`.
|
* [*Returns:] `!x`.
|
||||||
* [*Notes:] `T` need not meet requirements of __SGI_EQUALITY_COMPARABLE__.
|
* [*Notes:] `T` need not meet requirements of __STD_EQUALITY_COMPARABLE__.
|
||||||
|
|
||||||
|
|
||||||
__SPACE__
|
__SPACE__
|
||||||
|
Reference in New Issue
Block a user