blob: 47cbe2d514eec50abf98b20f80df90aa420d1abf [file] [log] [blame]
Louis Dionne4b1b70d2021-07-06 10:39:01 -04001.. _using-libcxx:
2
Eric Fiselierd720d1f2015-08-22 19:40:49 +00003============
4Using libc++
5============
6
7.. contents::
8 :local:
9
Louis Dionne4b1b70d2021-07-06 10:39:01 -040010Usually, libc++ is packaged and shipped by a vendor through some delivery vehicle
11(operating system distribution, SDK, toolchain, etc) and users don't need to do
12anything special in order to use the library.
Eric Fiselierd720d1f2015-08-22 19:40:49 +000013
Louis Dionne4b1b70d2021-07-06 10:39:01 -040014This page contains information about configuration knobs that can be used by
15users when they know libc++ is used by their toolchain, and how to use libc++
16when it is not the default library used by their toolchain.
17
18
19Using a different version of the C++ Standard
20=============================================
21
22Libc++ implements the various versions of the C++ Standard. Changing the version of
23the standard can be done by passing ``-std=c++XY`` to the compiler. Libc++ will
24automatically detect what Standard is being used and will provide functionality that
25matches that Standard in the library.
Eric Fiselierd720d1f2015-08-22 19:40:49 +000026
27.. code-block:: bash
28
Louis Dionne4b1b70d2021-07-06 10:39:01 -040029 $ clang++ -std=c++17 test.cpp
Eric Fiselierd720d1f2015-08-22 19:40:49 +000030
Louis Dionne4b1b70d2021-07-06 10:39:01 -040031.. warning::
32 Using ``-std=c++XY`` with a version of the Standard that has not been ratified yet
33 is considered unstable. Libc++ reserves the right to make breaking changes to the
34 library until the standard has been ratified.
Eric Fiselierd720d1f2015-08-22 19:40:49 +000035
Eric Fiselier02cea5e2018-07-27 03:07:09 +000036
Louis Dionne3d895a12022-07-19 10:44:06 -040037Enabling experimental C++ Library features
38==========================================
Eric Fiselierd720d1f2015-08-22 19:40:49 +000039
Louis Dionne3d895a12022-07-19 10:44:06 -040040Libc++ provides implementations of some experimental features. Experimental features
41are either Technical Specifications (TSes) or official features that were voted to
42the Standard but whose implementation is not complete or stable yet in libc++. Those
43are disabled by default because they are neither API nor ABI stable. However, the
44``_LIBCPP_ENABLE_EXPERIMENTAL`` macro can be defined to turn those features on. Note
45that you will also need to link to the appropriate ``libc++experimental.a`` static
46archive.
Eric Fiselierfa43a5c2016-05-03 22:32:08 +000047
48.. warning::
49 Experimental libraries are Experimental.
Louis Dionne3d895a12022-07-19 10:44:06 -040050 * The contents of the ``<experimental/...>`` headers and the associated static
Eric Fiselierfa43a5c2016-05-03 22:32:08 +000051 library will not remain compatible between versions.
52 * No guarantees of API or ABI stability are provided.
Louis Dionne4b1b70d2021-07-06 10:39:01 -040053 * When the standardized version of an experimental feature is implemented,
Louis Dionne37677132019-06-11 14:48:40 +000054 the experimental feature is removed two releases after the non-experimental
55 version has shipped. The full policy is explained :ref:`here <experimental features>`.
Eric Fiselierd720d1f2015-08-22 19:40:49 +000056
Eric Fiselierd720d1f2015-08-22 19:40:49 +000057
Louis Dionne4b1b70d2021-07-06 10:39:01 -040058Using libc++ when it is not the system default
59==============================================
60
61On systems where libc++ is provided but is not the default, Clang provides a flag
62called ``-stdlib=`` that can be used to decide which standard library is used.
63Using ``-stdlib=libc++`` will select libc++:
Eric Fiselierd720d1f2015-08-22 19:40:49 +000064
65.. code-block:: bash
66
Louis Dionne4b1b70d2021-07-06 10:39:01 -040067 $ clang++ -stdlib=libc++ test.cpp
Eric Fiselierd720d1f2015-08-22 19:40:49 +000068
Louis Dionnee4745512021-09-07 12:55:48 -040069On systems where libc++ is the library in use by default such as macOS and FreeBSD,
70this flag is not required.
Louis Dionne4b1b70d2021-07-06 10:39:01 -040071
72
73.. _alternate libcxx:
74
75Using a custom built libc++
76===========================
77
78Most compilers provide a way to disable the default behavior for finding the
79standard library and to override it with custom paths. With Clang, this can
80be done with:
Eric Fiselierd720d1f2015-08-22 19:40:49 +000081
82.. code-block:: bash
83
Louis Dionne4b1b70d2021-07-06 10:39:01 -040084 $ clang++ -nostdinc++ -nostdlib++ \
85 -isystem <install>/include/c++/v1 \
86 -L <install>/lib \
87 -Wl,-rpath,<install>/lib \
88 -lc++ \
89 test.cpp
Eric Fiselierd720d1f2015-08-22 19:40:49 +000090
Louis Dionne4b1b70d2021-07-06 10:39:01 -040091The option ``-Wl,-rpath,<install>/lib`` adds a runtime library search path,
92which causes the system's dynamic linker to look for libc++ in ``<install>/lib``
93whenever the program is loaded.
Eric Fiselierd720d1f2015-08-22 19:40:49 +000094
Louis Dionne4b1b70d2021-07-06 10:39:01 -040095GCC does not support the ``-nostdlib++`` flag, so one must use ``-nodefaultlibs``
96instead. Since that removes all the standard system libraries and not just libc++,
97the system libraries must be re-added manually. For example:
Eric Fiselierd720d1f2015-08-22 19:40:49 +000098
99.. code-block:: bash
100
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400101 $ g++ -nostdinc++ -nodefaultlibs \
102 -isystem <install>/include/c++/v1 \
103 -L <install>/lib \
104 -Wl,-rpath,<install>/lib \
105 -lc++ -lc++abi -lm -lc -lgcc_s -lgcc \
106 test.cpp
Eric Fiselier41ee4312016-01-20 01:26:30 +0000107
108
109GDB Pretty printers for libc++
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400110==============================
Eric Fiselier41ee4312016-01-20 01:26:30 +0000111
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400112GDB does not support pretty-printing of libc++ symbols by default. However, libc++ does
113provide pretty-printers itself. Those can be used as:
Eric Fiselier41ee4312016-01-20 01:26:30 +0000114
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400115.. code-block:: bash
Eric Fiselier41ee4312016-01-20 01:26:30 +0000116
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400117 $ gdb -ex "source <libcxx>/utils/gdb/libcxx/printers.py" \
118 -ex "python register_libcxx_printer_loader()" \
119 <args>
Eric Fiselierb3825302016-11-13 23:00:30 +0000120
121
Louis Dionne6e8eb552022-03-03 17:37:03 -0500122.. _assertions-mode:
123
124Enabling the "safe libc++" mode
125===============================
126
127Libc++ contains a number of assertions whose goal is to catch undefined behavior in the
128library, usually caused by precondition violations. Those assertions do not aim to be
129exhaustive -- instead they aim to provide a good balance between safety and performance.
130In particular, these assertions do not change the complexity of algorithms. However, they
131might, in some cases, interfere with compiler optimizations.
132
133By default, these assertions are turned off. Vendors can decide to turn them on while building
134the compiled library by defining ``LIBCXX_ENABLE_ASSERTIONS=ON`` at CMake configuration time.
135When ``LIBCXX_ENABLE_ASSERTIONS`` is used, the compiled library will be built with assertions
136enabled, **and** user code will be built with assertions enabled by default. If
137``LIBCXX_ENABLE_ASSERTIONS=OFF`` at CMake configure time, the compiled library will not contain
138assertions and the default when building user code will be to have assertions disabled.
139As a user, you can consult your vendor to know whether assertions are enabled by default.
140
141Furthermore, independently of any vendor-selected default, users can always control whether
142assertions are enabled in their code by defining ``_LIBCPP_ENABLE_ASSERTIONS=0|1`` before
143including any libc++ header (we recommend passing ``-D_LIBCPP_ENABLE_ASSERTIONS=X`` to the
144compiler). Note that if the compiled library was built by the vendor without assertions,
145functions compiled inside the static or shared library won't have assertions enabled even
146if the user defines ``_LIBCPP_ENABLE_ASSERTIONS=1`` (the same is true for the inverse case
147where the static or shared library was compiled **with** assertions but the user tries to
148disable them). However, most of the code in libc++ is in the headers, so the user-selected
149value for ``_LIBCPP_ENABLE_ASSERTIONS`` (if any) will usually be respected.
150
151When an assertion fails, an assertion handler function is called. The library provides a default
152assertion handler that prints an error message and calls ``std::abort()``. Note that this assertion
153handler is provided by the static or shared library, so it is only available when deploying to a
154platform where the compiled library is sufficiently recent. However, users can also override that
155assertion handler with their own, which can be useful to provide custom behavior, or when deploying
156to older platforms where the default assertion handler isn't available.
157
158Replacing the default assertion handler is done by defining the following function:
159
160.. code-block:: cpp
161
162 void __libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message)
163
164This mechanism is similar to how one can replace the default definition of ``operator new``
165and ``operator delete``. For example:
166
167.. code-block:: cpp
168
169 // In HelloWorldHandler.cpp
Louis Dionneb4fce352022-03-25 12:55:36 -0400170 #include <version> // must include any libc++ header before defining the handler (C compatibility headers excluded)
Louis Dionne6e8eb552022-03-03 17:37:03 -0500171
172 void std::__libcpp_assertion_handler(char const* file, int line, char const* expression, char const* message) {
173 std::printf("Assertion %s failed at %s:%d, more info: %s", expression, file, line, message);
174 std::abort();
175 }
176
177 // In HelloWorld.cpp
178 #include <vector>
179
180 int main() {
181 std::vector<int> v;
182 int& x = v[0]; // Your assertion handler will be called here if _LIBCPP_ENABLE_ASSERTIONS=1
183 }
184
185Also note that the assertion handler should usually not return. Since the assertions in libc++
186catch undefined behavior, your code will proceed with undefined behavior if your assertion
187handler is called and does return.
188
189Furthermore, throwing an exception from the assertion handler is not recommended. Indeed, many
190functions in the library are ``noexcept``, and any exception thrown from the assertion handler
191will result in ``std::terminate`` being called.
192
193Back-deploying with a custom assertion handler
194----------------------------------------------
195When deploying to an older platform that does not provide a default assertion handler, the
196compiler will diagnose the usage of ``std::__libcpp_assertion_handler`` with an error. This
197is done to avoid the load-time error that would otherwise happen if the code was being deployed
198on the older system.
199
200If you are providing a custom assertion handler, this error is effectively a false positive.
201To let the library know that you are providing a custom assertion handler in back-deployment
202scenarios, you must define the ``_LIBCPP_AVAILABILITY_CUSTOM_ASSERTION_HANDLER_PROVIDED`` macro,
203and the library will assume that you are providing your own definition. If no definition is
204provided and the code is back-deployed to the older platform, it will fail to load when the
205dynamic linker fails to find a definition for ``std::__libcpp_assertion_handler``, so you
206should only remove the guard rails if you really mean it!
207
Eric Fiselierb3825302016-11-13 23:00:30 +0000208Libc++ Configuration Macros
209===========================
210
211Libc++ provides a number of configuration macros which can be used to enable
212or disable extended libc++ behavior, including enabling "debug mode" or
213thread safety annotations.
214
Eric Fiselierb3825302016-11-13 23:00:30 +0000215**_LIBCPP_ENABLE_THREAD_SAFETY_ANNOTATIONS**:
216 This macro is used to enable -Wthread-safety annotations on libc++'s
Jennifer Chukwub9788092021-04-17 20:34:06 +0530217 ``std::mutex`` and ``std::lock_guard``. By default, these annotations are
Eric Fiselierb3825302016-11-13 23:00:30 +0000218 disabled and must be manually enabled by the user.
Shoaib Meenaif36e9882016-12-05 19:40:12 +0000219
220**_LIBCPP_DISABLE_VISIBILITY_ANNOTATIONS**:
221 This macro is used to disable all visibility annotations inside libc++.
222 Defining this macro and then building libc++ with hidden visibility gives a
223 build of libc++ which does not export any symbols, which can be useful when
224 building statically for inclusion into another library.
Eric Fiselier41b686e2016-12-08 23:57:08 +0000225
Eric Fiseliera7a14ed2017-01-13 22:02:08 +0000226**_LIBCPP_DISABLE_ADDITIONAL_DIAGNOSTICS**:
227 This macro disables the additional diagnostics generated by libc++ using the
228 `diagnose_if` attribute. These additional diagnostics include checks for:
229
Louis Dionne878a3a82018-12-06 21:46:17 +0000230 * Giving `set`, `map`, `multiset`, `multimap` and their `unordered_`
231 counterparts a comparator which is not const callable.
232 * Giving an unordered associative container a hasher that is not const
233 callable.
Eric Fiseliera7a14ed2017-01-13 22:02:08 +0000234
Shoaib Meenaicfd19602017-10-09 19:25:17 +0000235**_LIBCPP_NO_VCRUNTIME**:
236 Microsoft's C and C++ headers are fairly entangled, and some of their C++
237 headers are fairly hard to avoid. In particular, `vcruntime_new.h` gets pulled
238 in from a lot of other headers and provides definitions which clash with
239 libc++ headers, such as `nothrow_t` (note that `nothrow_t` is a struct, so
240 there's no way for libc++ to provide a compatible definition, since you can't
241 have multiple definitions).
242
243 By default, libc++ solves this problem by deferring to Microsoft's vcruntime
244 headers where needed. However, it may be undesirable to depend on vcruntime
245 headers, since they may not always be available in cross-compilation setups,
246 or they may clash with other headers. The `_LIBCPP_NO_VCRUNTIME` macro
247 prevents libc++ from depending on vcruntime headers. Consequently, it also
248 prevents libc++ headers from being interoperable with vcruntime headers (from
249 the aforementioned clashes), so users of this macro are promising to not
250 attempt to combine libc++ headers with the problematic vcruntime headers. This
251 macro also currently prevents certain `operator new`/`operator delete`
252 replacement scenarios from working, e.g. replacing `operator new` and
253 expecting a non-replaced `operator new[]` to call the replaced `operator new`.
254
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000255**_LIBCPP_ENABLE_NODISCARD**:
256 Allow the library to add ``[[nodiscard]]`` attributes to entities not specified
257 as ``[[nodiscard]]`` by the current language dialect. This includes
258 backporting applications of ``[[nodiscard]]`` from newer dialects and
259 additional extended applications at the discretion of the library. All
260 additional applications of ``[[nodiscard]]`` are disabled by default.
261 See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>` for
262 more information.
263
264**_LIBCPP_DISABLE_NODISCARD_EXT**:
265 This macro prevents the library from applying ``[[nodiscard]]`` to entities
266 purely as an extension. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
267 for more information.
268
Louis Dionneded5b772019-03-12 20:10:06 +0000269**_LIBCPP_DISABLE_DEPRECATION_WARNINGS**:
270 This macro disables warnings when using deprecated components. For example,
271 using `std::auto_ptr` when compiling in C++11 mode will normally trigger a
272 warning saying that `std::auto_ptr` is deprecated. If the macro is defined,
273 no warning will be emitted. By default, this macro is not defined.
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000274
Eric Fiselierddd77792017-02-17 03:25:08 +0000275C++17 Specific Configuration Macros
276-----------------------------------
277**_LIBCPP_ENABLE_CXX17_REMOVED_FEATURES**:
278 This macro is used to re-enable all the features removed in C++17. The effect
279 is equivalent to manually defining each macro listed below.
280
Eric Fiselier65d5b4c2017-02-17 03:30:25 +0000281**_LIBCPP_ENABLE_CXX17_REMOVED_AUTO_PTR**:
Arthur O'Dwyera6b51072021-05-24 18:36:17 -0400282 This macro is used to re-enable `auto_ptr`.
283
284**_LIBCPP_ENABLE_CXX17_REMOVED_BINDERS**:
285 This macro is used to re-enable the `binder1st`, `binder2nd`,
286 `pointer_to_unary_function`, `pointer_to_binary_function`, `mem_fun_t`,
287 `mem_fun1_t`, `mem_fun_ref_t`, `mem_fun1_ref_t`, `const_mem_fun_t`,
288 `const_mem_fun1_t`, `const_mem_fun_ref_t`, and `const_mem_fun1_ref_t`
289 class templates, and the `bind1st`, `bind2nd`, `mem_fun`, `mem_fun_ref`,
290 and `ptr_fun` functions.
291
292**_LIBCPP_ENABLE_CXX17_REMOVED_RANDOM_SHUFFLE**:
293 This macro is used to re-enable the `random_shuffle` algorithm.
294
295**_LIBCPP_ENABLE_CXX17_REMOVED_UNEXPECTED_FUNCTIONS**:
296 This macro is used to re-enable `set_unexpected`, `get_unexpected`, and
297 `unexpected`.
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000298
Mark de Wever0c9fe4c2022-07-07 19:07:03 +0200299C++20 Specific Configuration Macros
300-----------------------------------
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000301**_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17**:
302 This macro can be used to disable diagnostics emitted from functions marked
303 ``[[nodiscard]]`` in dialects after C++17. See :ref:`Extended Applications of [[nodiscard]] <nodiscard extension>`
304 for more information.
305
Arthur O'Dwyera6b51072021-05-24 18:36:17 -0400306**_LIBCPP_ENABLE_CXX20_REMOVED_FEATURES**:
307 This macro is used to re-enable all the features removed in C++20. The effect
308 is equivalent to manually defining each macro listed below.
309
310**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS**:
311 This macro is used to re-enable redundant members of `allocator<T>`,
312 including `pointer`, `reference`, `rebind`, `address`, `max_size`,
313 `construct`, `destroy`, and the two-argument overload of `allocate`.
Arthur O'Dwyera6b51072021-05-24 18:36:17 -0400314
Ilya Biryukov051e6b92022-06-15 10:55:55 +0200315**_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_VOID_SPECIALIZATION**:
316 This macro is used to re-enable the library-provided specializations of
317 `allocator<void>` and `allocator<const void>`.
318 Use it in conjunction with `_LIBCPP_ENABLE_CXX20_REMOVED_ALLOCATOR_MEMBERS`
319 to ensure that removed members of `allocator<void>` can be accessed.
320
Arthur O'Dwyerf5486c82021-05-25 14:34:18 -0400321**_LIBCPP_ENABLE_CXX20_REMOVED_BINDER_TYPEDEFS**:
322 This macro is used to re-enable the `argument_type`, `result_type`,
323 `first_argument_type`, and `second_argument_type` members of class
324 templates such as `plus`, `logical_not`, `hash`, and `owner_less`.
325
Arthur O'Dwyera6b51072021-05-24 18:36:17 -0400326**_LIBCPP_ENABLE_CXX20_REMOVED_NEGATORS**:
327 This macro is used to re-enable `not1`, `not2`, `unary_negate`,
328 and `binary_negate`.
329
330**_LIBCPP_ENABLE_CXX20_REMOVED_RAW_STORAGE_ITERATOR**:
331 This macro is used to re-enable `raw_storage_iterator`.
332
wmbatf5b33762021-07-02 17:08:36 +0000333**_LIBCPP_ENABLE_CXX20_REMOVED_TYPE_TRAITS**:
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400334 This macro is used to re-enable `is_literal_type`, `is_literal_type_v`,
wmbatf5b33762021-07-02 17:08:36 +0000335 `result_of` and `result_of_t`.
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000336
Louis Dionne4b1b70d2021-07-06 10:39:01 -0400337
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000338Libc++ Extensions
339=================
340
341This section documents various extensions provided by libc++, how they're
342provided, and any information regarding how to use them.
343
344.. _nodiscard extension:
345
346Extended applications of ``[[nodiscard]]``
347------------------------------------------
348
349The ``[[nodiscard]]`` attribute is intended to help users find bugs where
350function return values are ignored when they shouldn't be. After C++17 the
351C++ standard has started to declared such library functions as ``[[nodiscard]]``.
352However, this application is limited and applies only to dialects after C++17.
353Users who want help diagnosing misuses of STL functions may desire a more
354liberal application of ``[[nodiscard]]``.
355
356For this reason libc++ provides an extension that does just that! The
357extension must be enabled by defining ``_LIBCPP_ENABLE_NODISCARD``. The extended
358applications of ``[[nodiscard]]`` takes two forms:
359
3601. Backporting ``[[nodiscard]]`` to entities declared as such by the
361 standard in newer dialects, but not in the present one.
362
Arthur O'Dwyer108facb2021-04-05 14:56:03 -04003632. Extended applications of ``[[nodiscard]]``, at the library's discretion,
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000364 applied to entities never declared as such by the standard.
365
366Users may also opt-out of additional applications ``[[nodiscard]]`` using
367additional macros.
368
369Applications of the first form, which backport ``[[nodiscard]]`` from a newer
Arthur O'Dwyer108facb2021-04-05 14:56:03 -0400370dialect, may be disabled using macros specific to the dialect in which it was
371added. For example, ``_LIBCPP_DISABLE_NODISCARD_AFTER_CXX17``.
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000372
373Applications of the second form, which are pure extensions, may be disabled
374by defining ``_LIBCPP_DISABLE_NODISCARD_EXT``.
375
376
377Entities declared with ``_LIBCPP_NODISCARD_EXT``
378~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
379
380This section lists all extended applications of ``[[nodiscard]]`` to entities
381which no dialect declares as such (See the second form described above).
382
Nico Weber471b10a2019-04-03 18:13:08 +0000383* ``adjacent_find``
384* ``all_of``
385* ``any_of``
386* ``binary_search``
387* ``clamp``
388* ``count_if``
389* ``count``
390* ``equal_range``
391* ``equal``
392* ``find_end``
393* ``find_first_of``
394* ``find_if_not``
395* ``find_if``
396* ``find``
Roman Lebedevb5959fa2018-09-22 17:54:48 +0000397* ``get_temporary_buffer``
Nico Weber471b10a2019-04-03 18:13:08 +0000398* ``includes``
399* ``is_heap_until``
400* ``is_heap``
401* ``is_partitioned``
402* ``is_permutation``
403* ``is_sorted_until``
404* ``is_sorted``
405* ``lexicographical_compare``
406* ``lower_bound``
407* ``max_element``
408* ``max``
409* ``min_element``
410* ``min``
411* ``minmax_element``
412* ``minmax``
413* ``mismatch``
414* ``none_of``
415* ``remove_if``
416* ``remove``
417* ``search_n``
418* ``search``
419* ``unique``
420* ``upper_bound``
Louis Dionne346587e2019-08-13 11:12:28 +0000421* ``lock_guard``'s constructors
Arthur O'Dwyer108facb2021-04-05 14:56:03 -0400422* ``as_const``
Louis Dionne1462d4d2020-05-28 14:28:38 -0400423* ``bit_cast``
Arthur O'Dwyer108facb2021-04-05 14:56:03 -0400424* ``forward``
425* ``move``
426* ``move_if_noexcept``
427* ``identity::operator()``
428* ``to_integer``
429* ``to_underlying``
Louis Dionne39948462022-06-01 15:25:14 -0400430
431Additional types supported in random distributions
432~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
433
434The `C++ Standard <http://eel.is/c++draft/rand#req.genl-1.5>`_ mentions that instantiating several random number
435distributions with types other than ``short``, ``int``, ``long``, ``long long``, and their unsigned versions is
436undefined. As an extension, libc++ supports instantiating ``binomial_distribution``, ``discrete_distribution``,
437``geometric_distribution``, ``negative_binomial_distribution``, ``poisson_distribution``, and ``uniform_int_distribution``
438with ``int8_t``, ``__int128_t`` and their unsigned versions.