在模板函数中包装 std::format 无法使用最新的 MSVC 编译器更新进行编译

2023-11-25

我有点困惑为什么这段代码突然停止编译:https://godbolt.org/z/hhM5GG78x

但如果我将编译器改回 v19.31,它将编译:https://godbolt.org/z/11j8WbEzG

这是有问题的代码:

#include <format>
#include <string>

template <typename... Args>
void FormatString(const std::string_view& fmt_str, Args&&... args)
{
    puts(std::format(fmt_str, args...).c_str());
}

int main()
{
    FormatString("This is a {}.\n", "test");
    return 0;
}

这是我收到的错误消息:

<source>(7): error C7595: 'std::_Basic_format_string<char,const char (&)[5]>::_Basic_format_string': call to immediate function is not a constant expression
<source>(7): note: failure was caused by a read of a variable outside its lifetime
<source>(7): note: see usage of 'fmt_str'
<source>(12): note: see reference to function template instantiation 'void FormatString<const char(&)[5]>(const std::string_view &,const char (&)[5])' being compiled

它抱怨 fmt_str 在其生命周期之外使用。我不明白这是怎么回事?


第一个参数std::format必须在编译时知道,因为格式字符串被指定为只能构造为常量表达式。目的是保证无效格式字符串的编译时错误。

fmt_str是一个函数参数,因此它的值永远不是编译时常量。

您可以使用std::vformat相反,但它不会对格式字符串执行编译时检查,而是将其延迟到运行时(抛出std::format_error错误时):

puts(std::vformat(fmt_str, std::make_format_args(args...)).c_str());

如果你不需要fmt_str为了与运行时相关,您可以将其作为模板参数传递。不幸的是,目前这还不是那么简单,因为std::string and std::string_view不能用于此目的,并且字符串文字不能直接通过const char*非类型模板参数。

因此,您可能希望创建自己的结构固定长度字符串类型,该类型可以用作非类型模板参数,例如这是该用例的一个非常小的版本,您可能希望根据您的需求进行扩展:

template<std::size_t N>
struct fixed_string {
    char str[N];
    constexpr fixed_string(const char (&str_)[N]) noexcept {
        std::ranges::copy(str_, str);
    }
};

template <fixed_string fmt_str, typename... Args>
void FormatString(Args&&... args)
{
    puts(std::format(fmt_str.str, args...).c_str());
}

int main()
{
    FormatString<"This is a {}.\n">("test");
    return 0;
}

我假设 MSVC 还没有实现第一个参数的要求std::format在以前的版本中可以构造为常量表达式。

该要求是在 C++20 之后为 C++23 添加的,但如果理解正确,也可以作为缺陷报告追溯适用于 C++20,按照论文中列出的投票进行here其中包含相关更改。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在模板函数中包装 std::format 无法使用最新的 MSVC 编译器更新进行编译 的相关文章

  • C# 静态类型不能用作参数

    public static void SendEmail String from String To String Subject String HTML String AttachmentPath null String Attachme
  • 如何从字符串中提取子字符串直到遇到第二个空格?

    我有一个像这样的字符串 o1 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 1232 5467 如何仅提取 o1 1232 5467 要提取的字符数并不总是相同 因此 我只想提取直到遇到
  • 如何在 C# 中将 Json 转换为对象

    我想将 Json 转换为 C 中的对象 这里的 Json 是 值 e920ce0f e3f5 4c6f 8e3d d2fbc51990e4 如何使用 Object 问题看似愚蠢 但其实并不那么愚蠢 我没有简单的 Json 我有 IEnume
  • Selenium - C# - Webdriver - 无法找到元素

    在 C 中使用 selenium 我试图打开浏览器 导航到 Google 并找到文本搜索字段 我尝试下面的 IWebDriver driver new InternetExplorerDriver C driver Navigate GoT
  • 2个对象,完全相同(除了命名空间)c#

    我正在使用第三方的一组网络服务 但遇到了一个小障碍 在我手动创建将每个属性从源复制到目标的方法之前 我想我应该在这里寻求更好的解决方案 我有 2 个对象 一个是 Customer CustomerParty 类型 另一个是 Appointm
  • if constexpr 中的 not-constexpr 变量 – clang 与 GCC

    struct A constexpr operator bool const return true int main auto f auto v if constexpr v A a f a clang 6 接受该代码 GCC 8 拒绝它
  • Libev,如何将参数传递给相关回调

    我陷入了 libev 中争论的境地 通常 libev 在类似的函数中接收包 接收回调 没关系 但是实际操作中 我们需要派遣一个亲戚 写回调 根据收到的包裹处理具体工作 例如 S RECV MSG pstRecvMsg S RECV MSG
  • 测量进程消耗的 CPU 时钟

    我用 C 语言编写了一个程序 它是作为研究结果创建的程序 我想计算程序消耗的确切 CPU 周期 精确的循环次数 知道我怎样才能找到它吗 The valgrind tool cachegrind valgrind tool cachegrin
  • 条件类型定义

    如果我有一小段这样的代码 template
  • wordexp 失败时我们需要调用 wordfree 吗?

    wordexp 失败时我们需要调用 wordfree 吗 在某些情况下 调用 wordfree 似乎会出现段错误 例如 当 wordfree 返回字符串为 foo bar 的错误代码时 这在手册页中并不清楚 我已经看到在某些错误情况下使用了
  • 如何防止 Blazor NavLink 组件的默认导航

    从 Blazor 3 1 Preview 2 开始 应该可以防止默认导航行为 https devblogs microsoft com aspnet asp net core updates in net core 3 1 preview
  • 让网络摄像头在 OpenCV 中工作

    我正在尝试让我的网络摄像头在 Windows 7 64 位中的 OpenCV 版本 2 2 中捕获视频 但是 我遇到了一些困难 OpenCV 附带的示例二进制文件都无法检测到我的网络摄像头 最近我发现这篇文章表明答案在于重新编译一个文件 o
  • 对于 C# Express 用户来说,有哪些好的工具可以识别可能重复的代码? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 也可以看看 有什么工具可以检查重复的 VB NET 代码吗 https stackoverflow c
  • Unity3D - 将 UI 对象移动到屏幕中心,同时保持其父子关系

    我有一个 UI 图像 它的父级是 RectTransform 容器 该容器的父级是 UI 面板 而 UI 面板的父级是 Canvas 我希望能够将此 UI 图像移动到屏幕中心 即画布 同时保留父级层次结构 我的目标是将 UI 图像从中心动画
  • C++ 指针引用混淆

    struct leaf int data leaf l leaf r struct leaf p void tree findparent int n int found leaf parent 这是 BST 的一段代码 我想问一下 为什么
  • 如何从 Windows Phone 7 模拟器获取数据

    我有一个 WP7 的单元测试框架 它在手机上运行 结果相当难以阅读 因此我将它们写入 XDocument 我的问题是 如何才能将这个 XML 文件从手机上移到我的桌面上 以便我可以实际分析结果 到目前为止 我所做的是将 Debugger B
  • 如果将变量设置为等于新对象,旧对象会发生什么?

    假设我们有一个 X 类not有一个超载的operator 功能 class X int n X n 0 X int n n n int main X a 1 an object gets constructed here more code
  • .Net Reactive Extensions Framework (Rx) 是否考虑拓扑顺序?

    Net 反应式扩展框架是否按拓扑顺序传播通知以最大限度地减少更新量 就像 Scala Rx 所做的那样 Net 反应式扩展 Rx 是否可以 https github com lihaoyi scala rx wiki How it Work
  • 声明一个负长度的数组

    当创建负长度数组时 C 中会发生什么 例如 int n 35 int testArray n for int i 0 i lt 10 i testArray i i 1 这段代码将编译 并且启用 Wall 时不会出现警告 并且似乎您可以分配
  • 如何为有时异步的操作创建和实现接口

    假设我有数百个类 它们使用 计算 方法实现公共接口 一些类将执行异步 例如读取文件 而实现相同接口的其他类将执行同步代码 例如将两个数字相加 为了维护和性能 对此进行编码的好方法是什么 到目前为止我读到的帖子总是建议将异步 等待方法冒泡给调

随机推荐

  • 检查 Visual Basic 文本框中输入的数值

    我正在为我的 Visual Basic 课程编写一个程序 并且有一个简单的问题 我们被鼓励做的一件事是检查以确保文本框中输入的数量实际上是数字 我们的教授建议使用 IsNumeric 来执行此检查 但我遇到了一些麻烦 在他将其添加到说明中之
  • wicked_pdf:页脚高度/样式

    我正在使用很棒的wicked pdf 宝石生成 PDF 但我不知道如何更改页脚中的某些样式 我的页脚有一个 HAML 模板 大致如下所示 html head meta charset gt utf 8 wicked pdf styleshe
  • Jackson 使用匿名类进行反序列化

    我一整天都在寻找可以回答这个问题的东西 但到目前为止我还没有太多运气 我的问题很简单 如何使用 Jackson 正确反序列化匿名对象 private interface Interface1 int getValue public stat
  • 如何传递包含引号/空格的脚本参数?

    我正在尝试写一个脚本notify finish可以添加到任何命令的前面 完成后 它将运行以下参数给出的命令 然后在命令完成后向用户发送电子邮件 这是我所拥有的 PROG 1 Run command given by arguments EC
  • 从邮箱字符串获取电子邮件地址

    我需要从该邮箱字符串中提取电子邮件地址 我想到了str replace但显示名称和电子邮件地址不是静态的 所以我不知道如何使用正则表达式来做到这一点 例子 My name lt email protected gt 应该导致 email p
  • java.util.concurrent.LinkedBlockingQueue 中的奇怪代码

    All 我在LinkedBlockingQueue中发现了奇怪的代码 private E dequeue assert takeLock isHeldByCurrentThread Node
  • iOS 应用程序的两个版本 - 免费和付费 - 如何有条件地更改 Xcode 中的项目 ID?

    我的应用程序 ID 为 com mydomain AppName 它是paid版本 我决定介绍一下free版本也是如此 通过我的代码 我可以使用简单的 define ifdef 业务轻松添加广告 删除一些功能 但是 我确实需要我的应用程序
  • 使用 SyncAdapter 与 *本地* Gmail 和 Facebook 应用程序数据同步

    对于我需要开发的应用程序 我需要能够使用 SyncAdapter 与 gmail 和 facebook 数据同步 我希望与本地 Facebook 和 Gmail 应用程序 如果可用 同步 而不是与远程服务器同步 与本地应用程序同步意味着更少
  • 即使条件计算结果为 false,if 语句似乎也在计算

    昨晚工作到很晚 我们试图找出出现问题的原因 验证检查在不应该失败的时候失败了 我们最终在这段代码中添加了一条 print 语句 从 Reflector 中反汇编 以检查代码实际上是我们编写的 public static string Red
  • CSS 导入或带有“media”属性的

    在页面中包含 CSS 的最佳方法是什么 为什么 for eg or
  • JQuery旋钮显示数量变化

    我在用着jQuery 旋钮制作一些很酷的图表并且它运行得很好 但我有一个问题 我想让图表之间的显示数字有一个 符号连接 但我似乎无法让它发挥作用 通过 jquery 修改输入是行不通的 我尝试读入库的代码 但没有成功 以前有其他人遇到过这个
  • 当键盘出现时如何使视图控制器滚动到文本字段

    我想让我的uiviewcontroller xib滚动 我的视图控制器有大约 8 个文本字段 所以我的问题是当我想在第五期写点东西时textfield等等我的键盘覆盖了文本字段 我怎样才能摆脱这个问题 并使我的视图控制器滚动 由于我是iPh
  • 如何使用 Spring 4 和注释编写单元测试来验证异步行为?

    如何使用 Spring 4 和注释编写单元测试来验证异步行为 由于我习惯了 Spring 的 旧的 xml 风格 我花了一些时间才弄清楚这一点 所以我想我回答自己的问题是为了帮助别人 首先是公开异步下载方法的服务 Service publi
  • java中的3D Ray-Quad相交测试

    在 3D 空间中 我试图确定射线 直线是否与正方形相交 如果是 则确定它相交的正方形上的 x 和 y 位置 我有一条由两点表示的射线 R1 Rx1 Ry1 Rz1 and R2 Rx2 Ry2 Rz2 正方形由四个顶点表示 S1 Sx1 S
  • 将参与者添加到 XMPP 聊天室

    我想在我的应用程序中实现群聊 为此我使用 MUC 聊天室来实现相同的功能 在这里 我想向房间添加成员列表 我有 JID 我想将它们内部添加到列表中的所有成员中 我如何在不邀请他们的情况下添加他们 添加成员后 我想实现一项功能 每当聊天室的用
  • 是否可以在 Dart 类中将方法声明为 Final?

    在 Java 中 可以在类中声明方法以防止子类覆盖它 例如 class Foo final void bar some code here Dart中有类似的构造吗 package meta提供了一个 nonVirtual注解禁止覆盖方法和
  • 在 SecureRandom 类中使用“SHA1PRNG”

    我有一个基本问题 为什么在 SecureRandom 类中使用 SHA1PRNG 如果有人解释一下 将会很有帮助 提前致谢 前任 SecureRandom getInstance SHA1PRNG Warning 我认为直接依赖这个算法是不
  • 从平面列表创建 java 层次结构树集

    我有对象 T 的列表 它有一个父属性 其中顶部对象的父属性为 null 我想将所有对象放入 TreeSet 或 TreeMap 中 顶级对象将是所有没有父对象 父对象为空 的根对象 并且它们下面将有子对象 像这样的东西 o Ra Rb Rc
  • Ninject 和 ASP.NET Web API

    在我提出问题之前 您应该知道我从此页面获取了当前的代码 http www strathweb com 2012 05 using ninject with the latest asp net web api source 我正在尝试通过使
  • 在模板函数中包装 std::format 无法使用最新的 MSVC 编译器更新进行编译

    我有点困惑为什么这段代码突然停止编译 https godbolt org z hhM5GG78x 但如果我将编译器改回 v19 31 它将编译 https godbolt org z 11j8WbEzG 这是有问题的代码 include