There is no such standard facility. C99 and C++11 implementations do have such macros in <stdint.h>
/<cstdint>
. But even there, the macros are only defined for the stdint.h
types, which do not include size_t
.
You could define a user-defined literal operator:
constexpr std::size_t operator "" _z ( unsigned long long n )
{ return n; }
auto sz = 5_z;
static_assert( std::is_same< decltype( sz ), std::size_t >::value, "" );
The constexpr
is necessary to use it in array bounds int arr[ 23_z ]
or case 9_z:
labels.
Most would probably consider the lack of macros to be an advantage :) .
Cuteness aside, the best way is to use brace initialization: std::size_t{ 42 }
. This is not equivalent to std::size_t( 42 )
which is like a nasty C cast — presumably what you were avoiding with static_cast
. Quite the opposite: the braces require that the value inside is exactly representable in the targeted type. So, char{ 300 }
and std::size_t{ -1 }
are both ill-formed.
Braces and parens look similar, but they're polar opposites in safety when initializing temporaries. Braces are safer than the literal operator could ever be, since unlike a function they can discriminate compile-time values.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…