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

头文件中删除文件作用域函数是否需要添加inline关键字的疑问

头文件中删除文件作用域函数是否需要添加inline关键字的疑问

嘿,这个问题问得特别实在,很多人在写头文件的deleted函数时都会踩这个坑!咱们来把这事掰扯明白:

首先得明确一个关键前提:void Foo() = delete;这行代码是一个函数定义,而不只是声明。= delete是C++11起用来标记函数被删除的语法,它属于定义的一部分,不是单纯的声明语句。

那回到你的问题:在头文件里写这种deleted的文件作用域函数,必须要加inline,核心原因是为了遵守C++的「单定义规则(ODR)」:

  • 头文件会被多个源文件(.cpp)包含,如果不加inline,每个包含这个头文件的源文件都会生成一份Foo()的deleted定义。链接器在合并所有目标文件时,会发现多个完全相同的Foo()定义,直接抛出「重复定义」的错误。
  • 而inline关键字的一个核心作用就是放宽ODR:标记为inline的函数(哪怕是deleted的),允许在多个翻译单元(源文件)中存在完全一致的定义,链接器不会报错。

给你举两个实际例子对比一下:

错误写法(会踩链接坑)

// my_header.h(不要这么写!)
void Foo() = delete;
// 当被2个及以上.cpp文件包含时,链接阶段会报"multiple definition of `Foo()`"

正确写法(安全合规)

// my_header.h(推荐写法)
inline void Foo() = delete;
// 多个源文件包含也不会触发链接错误,完全符合C++规则

还有个小细节要提:哪怕你这个函数永远不会被调用,只要它在头文件里不加inline被多文件包含,链接错误就一定会来——因为deleted函数的定义依然会被编译器生成到每个目标文件里。

总结一下:为了避免链接阶段的致命错误,同时严格契合C++的语言规则,在头文件中定义文件作用域的deleted函数时,一定要加上inline关键字!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.07 13:09:32