safe_signed_literal<Value, PP , EP> and
safe_unsigned_literal<Value, PP, EP>DescriptionA safe type which holds a literal value. This is required to be able
to initialize other safe types in such a way that an exception code is not
generated. It is also useful when creating constexpr versions of safe
types. It contains one immutable value known at compile time and hence can
be used in any constexpr expression.Model ofIntegerSafeNumericThis type inherits all the notation, associated types and template
parameters and valid expressions of SafeNumeric types. The
following specify additional features of this type.Associated TypesPPA type which specifies the result type of an expression
using safe types.EPA type containing members which are called when a correct
result cannot be returnedTemplate ParametersParameterType RequirementsDescriptionValueIntegervalue used to initialize the literalPPPromotionPolicy<PP>Optional promotion policy. Default value is
voidEPException
Policy<EP>Optional exception policy. Default value is
voidInherited Valid Expressionssafe literal types are immutable. Hence they only inherit those
valid expressions which don't change the value. This excludes
assignment, increment, and decrement and all unary operators except unary
-, + and ~. Other than that, they can be used anywhere a SafeNumeric type can
be used. Note that the default promotion and exception policies are void.
This is usually convenient since when a safe literal is used in a binary
operation, this will inherit the policies of the other type. On the other
hand, this can be inconvenient when operands of a binary expression are
both safe literals. This will fail to compile since there are no
designated promotion and exception policies. The way to address this to
assign specific policies as in this example.template<typename T>
using compile_time_value = safe_signed_literal<T>;
constexpr compile_time_value<1000> x;
constexpr compile_time_value<0> y;
// should compile and execute without problem
std::cout << x << '\n';
// all the following statements should fail to compile because there are
// no promotion and exception policies specified.
constexpr safe<int> z = x / y;
Example of use#include <boost/numeric/safe_numerics/safe_integer_literal.hpp>
constexpr boost::numeric::safe_signed_literal<42> x;
make_safe_literal(n, PP, EP) This is a macro which returns an instance of a safe literal type.
This instance will hold the value n. The type of the value returned will
be the smallest safe type which can hold the value n.Header#include
<boost/numeric/safe_numerics/safe_integer_literal.hpp>