我有以下代码:
#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_stringC++20 中的差异是什么导致了这个问题?如何修复此代码以符合 C++20?::basic_format_string(const S&) ...(带有 S= 和一堆别名)...在常量表达式中
我正在使用
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 构造函数)您需要转发参数,以便它们具有正确的值类别:
auto _ = fmt::format( str, std::forward<T>(args)... );