c++ std::move_iterator basic_format_string< char *>'不是常量表达式

lo8azlld  于 2023-07-01  发布在  其他
关注(0)|答案(1)|浏览(174)

下面是代码

m_state.script_file(
            ( std::filesystem::path{ xorstr_( "magma/luas" ) } /= name ).string( ),
            [ & ] ( lua_State* const state, sol::protected_function_result result ) {
                if ( !result.valid( ) )
                    valve::g_cvar->con_print( false, 0xff0000ffu,
                        std::format( xorstr_( "can't load {}, reason: {}.\n" ), name, sol::error{ result }.what( ) ).data( )
                    );

                return result;
            }
        );

错误消息

call to consteval function 'std::basic_format_string<char, const std::basic_string<char> &, const char *>::basic_format_string<char *>' is not a constant expression

当我使用llvm12.0时一切正常,但当我更改为llvm 15.0.1时,它显示错误
我将其更改为fmt::format,但仍然不起作用

wswtfjt7

wswtfjt71#

默认情况下,格式字符串在编译时必须是已知的。现在你可以使用std::vformat和一个运行时格式字符串:

std::vformat(xorstr_("can't load {}, reason: {}.\n"),
             std::make_format_args(name, sol::error{result}.what()))

有一个建议是在std::format中添加对运行时格式字符串的直接支持,类似于{fmt}中的fmt::runtime

相关问题