fmt `fmt::v10::basic_format_string` 与 C++20

问题描述 投票:0回答:1

我有以下代码:

#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

::basic_format_string(const S&) ...(带有 S= 和一堆别名)...在常量表达式中

C++20 中的差异是什么导致了这个问题?如何修复此代码以符合 C++20?

我正在使用

fmt v10.0.0

c++ c++20 fmt
1个回答
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)... );
    
© www.soinside.com 2019 - 2024. All rights reserved.