You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

std::format_to中参数与输出缓冲区别名化的行为探究

C++ std::format_to 别名化缓冲区的行为问题
#include <format>
#include <print>

int main() {
    int x = 12345;
    // 注:这里是"awoo"后跟28个零([dcl.init.string] p3)
    char buffer[32] = "awoo";
    std::format_to(buffer, "{}{}", x, buffer);
    std::println("{}", buffer);
}

这段代码的预期输出是12345awoo——按照逻辑,我们是用参数12345和初始值为"awoo"的buffer来格式化"{}{}"。
但运行后实际输出却是1234512345:因为格式化第一个参数12345时会直接写入缓冲区,等到处理第二个参数buffer时,缓冲区里的内容已经被覆盖,不再是初始的"awoo"了。

核心问题:根据C++标准,预期结果是什么?

根据C++标准中vformat_to的相关规范,标准并未将「格式化参数与输出缓冲区别名化」列为函数的前置条件,因此这种情况不属于未定义行为。也就是说,标准要求实现必须正确处理该场景,确保第二个参数读取的是缓冲区的初始状态值,而非被修改后的值。

内容的提问来源于stack exchange,提问作者Jan Schultke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 03:57:04