Spec-Zone.ru › C++

std::print

Определено в заголовке <print>
template< class... Args >
void print( std::format_string<Args...> fmt, Args&&... args );
(1) (начиная с C++23)
template< class... Args >
void print( std::FILE* stream,
            std::format_string<Args...> fmt, Args&&... args );
(2) (начиная с C++23)

Форматирует args согласно строке формата fmt и выводит результат в поток вывода.

1) Эквивалентно std::print(stdout, fmt, std::forward<Args>(args)...).
2) Если кодировка обычных литералов — UTF-8, эквивалентно
(std::enable_nonlocking_formatter_optimization<std::remove_cvref_t<Args>> && ...)
    ? std::vprint_unicode(stream, fmt.str, std::make_format_args(args...))
    : std::vprint_unicode_buffered(stream, fmt.str, std::make_format_args(args...));
В противном случае эквивалентно
(std::enable_nonlocking_formatter_optimization<std::remove_cvref_t<Args>> && ...)
    ? std::vprint_nonunicode(stream, fmt.str, std::make_format_args(args...))
    : std::vprint_nonunicode_buffered(stream, fmt.str, std::make_format_args(args...));

Если std::formatter<Ti,char> не удовлетворяет требованиям BasicFormatter для любого Ti в Args (как того требует std::make_format_args), поведение не определено.

Параметры

stream - поток вывода файла, в который производится запись
fmt - объект, представляющий строку формата. Строка формата состоит из
  • обычных символов (кроме { и }), которые без изменений копируются в выходные данные,
  • управляющих последовательностей {{ и }}, которые заменяются соответственно на { и } в выходных данных, и
  • полей подстановки.

Каждое поле подстановки имеет следующий формат:

{ arg-id (необязательно) } (1)
{ arg-id (необязательно) : format-spec } (2)
1) поле подстановки без спецификации формата 2) поле подстановки со спецификацией формата
arg-id - задаёт индекс аргумента в args, значение которого используется для форматирования; если он опущен, аргументы используются по порядку.

Все arg-id в строке формата должны быть либо указаны, либо опущены. Смешивание ручной и автоматической индексации является ошибкой.

format-spec - спецификация формата, определённая специализацией std::formatter для соответствующего аргумента. Не может начинаться с }.
  • Для базовых типов и стандартных строковых типов спецификация формата интерпретируется как стандартная спецификация формата.
  • Для типов chrono спецификация формата интерпретируется как спецификация формата chrono.
  • Для типов-диапазонов спецификация формата интерпретируется как спецификация формата диапазона.
  • Для std::pair и std::tuple спецификация формата интерпретируется как спецификация формата кортежа.
  • Для std::thread::id и std::stacktrace_entry см. спецификацию формата идентификатора потока и спецификацию формата записи трассировки стека.
  • Для std::basic_stacktrace спецификатор формата не допускается.
(начиная с C++23)
  • Для std::filesystem::path см. спецификацию формата пути.
(начиная с C++26)
  • Для других форматируемых типов спецификация формата определяется пользовательскими специализациями formatter.
args... - аргументы для форматирования

Исключения

  • std::bad_alloc при сбое выделения памяти.
  • std::system_error, если запись в поток завершается ошибкой.
  • Передаёт любое исключение, выброшенное используемыми форматтерами, например std::format_error.

Примечания

Макрос проверки поддержки Значение Стандарт Возможность
__cpp_lib_print 202207L (C++23) Форматированный вывод
202403L (C++26)
(DR23)
Небуферизованный форматированный вывод
202406L (C++26)
(DR23)
Разрешение небуферизованного форматированного вывода для большего числа форматируемых типов
__cpp_lib_format 202207L (C++23) Предоставление std::basic_format_string

Пример

#include <cstdio>
#include <filesystem>
#include <print>

int main()
{
    std::print("{2} {1}{0}!\n", 23, "C++", "Hello");  // overload (1)
    
    const auto tmp{std::filesystem::temp_directory_path() / "test.txt"};
    if (std::FILE* stream{std::fopen(tmp.c_str(), "w")})
    {
        std::print(stream, "File: {}", tmp.string()); // overload (2)
        std::fclose(stream);
    }
}

Вывод:

Hello C++23!

Отчёты об ошибках

Следующие отчёты об ошибках, изменяющие поведение, были ретроактивно применены к ранее опубликованным стандартам C++.

DR Применён к Опубликованное поведение Корректное поведение
P3107R5 C++23 можно выполнять только буферизованные операции вывода можно выполнять небуферизованные операции вывода
P3235R3 C++23 имена функций, добавленных
документом P3107R5, вводили в заблуждение
имена функций изменены

См. также

println
(C++23)
то же, что и std::print, за исключением того, что после каждого вывода добавляется символ новой строки
(функциональный шаблон)
print(std::ostream)
(C++23)
выводит форматированное представление аргументов
(функциональный шаблон)
format
(C++20)
сохраняет форматированное представление аргументов в новой строке
(функциональный шаблон)
format_to
(C++20)
записывает форматированное представление аргументов через выходной итератор
(функциональный шаблон)
printffprintfsprintfsnprintf
(C++11)
выводит форматированные данные в stdout, файловый поток или буфер
(функция)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/io/print

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API