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

C++20中std::source_location在自由函数与模板函数间返回不同列号的问题

为什么模板函数g()和自由函数f()的source_location列号不一样?

先看你给出的代码:

#include <iostream>
#include <source_location>
auto g(auto...) { std::cout << std::source_location::current().column() << "\n"; }
auto f() { std::cout << std::source_location::current().column() << "\n"; }
int main() { g(); f(); }

用GCC-trunk编译运行后,输出是43 44,和你预期的一致结果不符,核心原因是GCC对普通函数和模板函数中std::source_location::current()的位置解析逻辑存在差异:

  • 对于普通自由函数f():编译器在编译f()时,会直接将std::source_location::current()的位置绑定到函数定义里调用该方法的代码所在列——也就是你写std::source_location::current()这段代码的列号,对应输出的44。
  • 对于模板函数g():由于模板采用延迟实例化机制(只有被调用时才会生成具体的函数代码),GCC的实现选择将std::source_location::current()的位置绑定到函数的调用点,也就是main()里写g();的那个列号,对应输出的43。

这并非所谓的“单位偏移缺失”,而是编译器针对模板的特殊处理逻辑导致的位置绑定差异。如果希望模板函数和普通函数的行为一致(比如都获取调用点的位置),更规范的写法是把std::source_location作为默认参数传递(这也是C++标准推荐的获取调用点位置的方式):

#include <iostream>
#include <source_location>
auto g(auto..., const std::source_location& loc = std::source_location::current()) { 
    std::cout << loc.column() << "\n"; 
}
auto f(const std::source_location& loc = std::source_location::current()) { 
    std::cout << loc.column() << "\n"; 
}
int main() { g(); f(); }

这样修改后,不管是模板还是普通函数,都会输出调用点的列号,结果就会一致了。

内容的提问来源于stack exchange,提问作者康桓瑋

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 11:17:30