Глядя на документацию , я не понимаю, почему std::make_format_args()
принимает ссылку, а не константную ссылку?
Моя цель - реализовать что-то вроде:
#include <format>
template <class... Args>
inline static std::string format(const std::string_view field, Args&&... args)
{
return std::vformat(field, std::make_format_args(std::forward<Args>(args)...));
}
И возможность передать const std::string&
в качестве входных данных в args
, но похоже, что std::make_format_args()
ожидает неконстантную ссылку.
Я получаю сообщение об ошибке:
A non-const reference may only be bound to an lvalue C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\MSVC\14.40.33807\include\format(3713): note: see declaration of 'std::make_format_args'
note: while trying to match the argument list '(_Ty, const std::string, _Ty, _Ty)'
ОБНОВЛЯТЬ
Я могу воспроизвести ошибку здесь: https://godbolt.org/z/nj763o48r (локально я получаю ту же ошибку, что и выше)
template< class Context = std::format_context, class... Args > /*format-arg-store*/<Context, Args...> make_format_args( Args&... args );
ваш код не компилируется? В чем проблема с тем, что вы хотите реализовать? Кажется, вы уже достигли цели. Почему нет?
Я допустил ошибку в описании
Раньше это не работало, и не могу найти, какую строку, извините, попробую
пример того, как T&
можно вывести как const T&
и чтобы в вашем коде не было ошибок godbolt.org/z/PPWTeE98M (из удаленного ответа)
воспроизвожу ошибку!!
@SpeakX, ваша ссылка на godbolt ведет только на общую страницу godbolt. Вам необходимо получить общую ссылку из меню в верхней панели сайта.
DONE поделился ссылкой
@SpeakX На ваш вопрос уже дан ответ, но чтобы исправить свой код, просто не вызывайте std::forward для args. Например. рабочая версия вашего примера: godbolt.org/z/6vd5eeWj4
Из-за плохого пользовательского опыта и проблем безопасности, подробно описанных в отчете о дефектах P2905R2 . Проблема (сводка взята из нижней части страницы документации) заключалась в том, что «make_format_args принимала аргументы rvalue путем пересылки ссылок», и решение заключалось в том, что make_format_args «принимает только ссылки lvalue».
Как я могу сделать то, что хочу, и в чем разница между fmt и format, пожалуйста
@SpeakX Пробовали ли вы просто не использовать ссылки на пересылку и просто принимать Args&...
, как это делает стандартная функция? А {fmt} — это, по сути, библиотека, на которой основан std::format (хотя, поскольку ей не нужно было проходить все через процесс стандартизации, она не на 100% одинакова).
Попробую это. Я воспроизвожу ошибку. Я обновил свой вопрос!!
Где в документации сказано, что функция не принимает константные ссылки? Даже в примере кода используются константные ссылки.