{fmt}: Будет ли именованный аргумент игнорироваться, если он не существует в строке форматирования?

#c #fmt

Вопрос:

Следующий код компилируется просто отлично и выдает строку «abc».:

 fmt::format("abc", fmt::arg("x", 42));
 

божья молния

Таким образом, похоже, что именованные аргументы, отсутствующие в строке формата, просто игнорируются.

Мой вопрос: это специально или это ошибка?

Я спрашиваю, потому что у меня есть вариант использования этой «функции». Поэтому я хочу убедиться, что это не UB и что это не будет «исправлено» в будущем.

Я уже просмотрел документы, но не смог найти этот вариант использования.

Комментарии:

1. FWIW, это довольно согласуется с тем, как другие языки обрабатывают такой тип поведения, например, в python print('abc'.format(42)) также будет просто выводиться 'abc'

2. До тех пор, пока вызов соответствует сигнатуре вызываемой функции (в конце концов, это своего рода требование для построения кода), все неиспользуемые аргументы будут просто неиспользуемыми. Это будет работать аналогично функции, которая определяет определенный набор аргументов, но оставляет их безымянными (анонимными) в фактическом определении функции, что означает, что аргументы просто не используются.

3.en.cppreference.com/w/cpp/utility/format/format It is not an error to provide more arguments than the format string requires , но это для std::format . Исследуйте fmt проблемы github.

Ответ №1:

Это сделано специально. Неиспользуемые аргументы форматирования по существу совпадают с неиспользуемыми аргументами любой другой функции и не являются ошибкой. Это имеет место в {fmt}, и str.format он смоделирован по образцу Python, а также printf .

Комментарии:

1. Ответ от самого автора должен быть правильным, я думаю 🙂