头文件中删除文件作用域函数是否需要添加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
相关产品推荐
相关产品推荐

