Конструирует новый экземпляр std::once_flag, оставляя его в состоянии, означающем, что ассоциированная функция еще не вызывалась. Поскольку в конструкторе присутствует квалификатор constexpr, то экземпляр со статическим временем жизни конструируется на этапе статической инициализации, что предотвращает состояние гонки и зависимость от порядка инициализации.
D.5.10. Шаблон функции std::call_once
Шаблон функции std::call_once используется совместно с объектом std::once_flag для гарантии того, что некая функция будет вызвала ровно один раз, даже если ее могут вызывать одновременно несколько потоков.
template
void call_once(
std::once_flag& flag, Callable func, Args args...);
Выражение INVOKE(func, args) допустимо для переданных значений func и args. Тип Callable и все члены Args удовлетворяют требованиям концепции MoveConstructible.
Обращения к std::call_once с одним и тем же объектом std::once_flag сериализуются. Если раньше не было результативного обращения к std::call_once с данным объектом std::once_flag, то аргумент func (или его копия) вызывается так, будто имело место обращение к INVOKE(func, args), причем вызов std::call_once считается результативным тогда и только тогда, когда вызов func завершился без возбуждения исключения. Если имело место исключение, то оно передается вызывающей программе. Если ранее уже было результативное обращение к std::call_once с данным объектом std::once_flag, то новый вызов std::call_once возвращает управление, не вызывая func.
Возврат из результативного вызова std::call_once с объектом std::once_flag происходит-раньше всех последующих вызовов std::call_once с тем же объектом std::once_flag.
Исключение типа std::system_error, если желаемого эффекта добиться не удалось, или любое исключение, возбужденное при обращении к func.
D.6. Заголовок
В заголовке объявлены средства для поддержки арифметических операций с рациональными числами на этапе компиляции.
namespace std {
template
class ratio;
// арифметические операции с рациональными числами
template
using ratio_add =
template
using ratio_subtract =
template
using ratio_multiply =
template
using ratio_divide =
// сравнение рациональных чисел
template
struct ratio_equal;
template
struct ratio_not_equal;
template
struct ratio_less;
template
struct ratio_less_equal;
template
struct ratio_greater;
template
struct ratio_greater_equal;
typedef ratio<1, 1000000000000000000> atto;
typedef ratio<1, 1000000000000000> femto;
typedef ratio<1, 1000000000000> pico;
typedef ratio<1, 1000000000> nano;
typedef ratio<1, 1000000> micro;
typedef ratio<1, 1000> milli;
typedef ratio<1, 100> centi;
typedef ratio<1, 10> deci;
typedef ratio<10, 1> deca;
typedef ratio<100, 1> hecto;
typedef ratio<1000, 1> kilo;
typedef ratio<1000000, 1> mega;
typedef ratio<1000000000, 1> giga;
typedef ratio<1000000000000, 1> tera;
typedef ratio<1000000000000000, 1> peta;
typedef ratio<1000000000000000000, 1> exa;
D.6.1. Шаблон класса std::ratio
Шаблон класса предоставляет механизм для выполнения на этапе компиляции арифметических операций с рациональными числами, например: деления пополам (std::ratio<1, 2>), нахождения двух третей (std::ratio<2, 3>) пятнадцати сорок третьих (std::ratio<15, 43>). В стандартной библиотеке С++ этот шаблон используется для задания периода при конкретизации шаблона класса std::chrono::duration.