Почему std::make_format_args ожидает неконстантную ссылку

Глядя на документацию , я не понимаю, почему 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 (локально я получаю ту же ошибку, что и выше)

Где в документации сказано, что функция не принимает константные ссылки? Даже в примере кода используются константные ссылки.

tkausl 15.08.2024 20:49

template< class Context = std::format_context, class... Args > /*format-arg-store*/<Context, Args...> make_format_args( Args&... args );

SpeakX 15.08.2024 20:51

ваш код не компилируется? В чем проблема с тем, что вы хотите реализовать? Кажется, вы уже достигли цели. Почему нет?

463035818_is_not_an_ai 15.08.2024 20:51

Я допустил ошибку в описании

SpeakX 15.08.2024 20:52

Раньше это не работало, и не могу найти, какую строку, извините, попробую

SpeakX 15.08.2024 21:00

пример того, как T& можно вывести как const T& и чтобы в вашем коде не было ошибок godbolt.org/z/PPWTeE98M (из удаленного ответа)

463035818_is_not_an_ai 15.08.2024 21:14

воспроизвожу ошибку!!

SpeakX 15.08.2024 21:29

@SpeakX, ваша ссылка на godbolt ведет только на общую страницу godbolt. Вам необходимо получить общую ссылку из меню в верхней панели сайта.

Sir Nate 15.08.2024 21:34

DONE поделился ссылкой

SpeakX 15.08.2024 21:36

@SpeakX На ваш вопрос уже дан ответ, но чтобы исправить свой код, просто не вызывайте std::forward для args. Например. рабочая версия вашего примера: godbolt.org/z/6vd5eeWj4

Sir Nate 15.08.2024 21:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
10
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Из-за плохого пользовательского опыта и проблем безопасности, подробно описанных в отчете о дефектах P2905R2 . Проблема (сводка взята из нижней части страницы документации) заключалась в том, что «make_format_args принимала аргументы rvalue путем пересылки ссылок», и решение заключалось в том, что make_format_args «принимает только ссылки lvalue».

Как я могу сделать то, что хочу, и в чем разница между fmt и format, пожалуйста

SpeakX 15.08.2024 20:56

@SpeakX Пробовали ли вы просто не использовать ссылки на пересылку и просто принимать Args&..., как это делает стандартная функция? А {fmt} — это, по сути, библиотека, на которой основан std::format (хотя, поскольку ей не нужно было проходить все через процесс стандартизации, она не на 100% одинакова).

Sir Nate 15.08.2024 21:28

Попробую это. Я воспроизвожу ошибку. Я обновил свой вопрос!!

SpeakX 15.08.2024 21:28

Другие вопросы по теме