我有以下代码:
#include <fmt/core.h>
template <typename ...T>
void func( const fmt::format_string<T...>& str, T&& ...args )
{
auto _ = fmt::format( str, args... );
}
int main()
{
func( "foo {}", 3 );
}
(此处查看实例)
如果我使用 ,它就会按我期望的方式编译并运行--std=c++17
;但是,如果我使用 ,它就不会--std=c++20
编译。具体来说,我得到这个错误:
consteval fmt::v10::basic_format_string<Char, Args>::basic_format_string(const S&) ... (带有 S= 和一堆 aka) ... 在常量表达式中
C++20 中的哪些差异导致此问题?如何修复此代码以符合 C++20?
我正在使用fmt v10.0.0
。
您有一个
fmt::format_string<int>
。当您调用 时fmt::format( str, args... )
,args...
会扩展为单个左值int
,因此第一个参数需要是fmt::format_string<int&>
。(错误是它尝试调用
format_string::operator string_view
,但未标记为constexpr
。该错误仅发生在 C++20 中,因为它只是 C++20 中的 consteval 构造函数)您需要转发参数以便它们具有正确的值类别: