代码之家  ›  专栏  ›  技术社区  ›  SpeakX

为什么std::make_format_args需要一个非常量引用

  •  1
  • SpeakX  · 技术社区  · 2 月前

    看着 documentation ,我不明白为什么 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() 需要一个非const引用。

    我收到一个错误:

    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 (在本地,我得到了与上述完全相同的错误)

    1 回复  |  直到 2 月前
        1
  •  4
  •   Sir Nate    2 月前

    由于用户体验不佳和缺陷报告中详述的安全问题 P2905R2 该问题(摘要摘自 bottom of the documentation page )问题是“make_format_args通过转发引用接受右值参数”,而解决方案是make_fformat_args“只接受左值引用”。