#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. Ответ от самого автора должен быть правильным, я думаю 🙂