查看文档,我不明白为什么std::make_format_args()
采用引用而不是 const 引用?
我的目标是实现类似以下的事情:
#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(在本地我得到与上述完全相同的错误)
由于缺陷报告P2905R2中详细说明的用户体验差和安全问题。问题(摘要取自文档页面底部)是“make_format_args 通过转发引用接受右值参数”,解决方案是 make_format_args“仅接受左值引用”。