为什么内联函数默认具有外部链接?

Bil*_*eal 18 c++ inline linkage c++11 c++03

标准说,给出声明

inline void foo();
Run Code Online (Sandbox Code Playgroud)

foo是一个带有外部链接内联函数(因为默认情况下所有函数声明都有外部链接).这让我很奇怪.因为一个定义规则第3.2节(在C++ 03和C++ 11中)都说:

3 ...应在每个使用它的翻译单元中定义内联函数.

5 [n] ...内联函数可以有多个定义与外部联系(7.1.2)......给定这样一个名为D的实体在多个翻译单元中定义... D的每个定义应由相同的令牌序列组成

这意味着内联函数也可能具有内部链接,因为通过外部链接(即跨翻译单元)以任何方式使用函数将调用未定义的行为(通过第3段),并且内容为所有翻译单元中的内联功能需要相同.

此规则是否存在向后兼容性或特定工具链的原因?

Mar*_*som 18

该决定的一个结果是在内联函数内定义的静态变量将在函数的所有实例化之间共享.如果默认值是内部链接,则每个翻译单元都会获得自己的静态变量副本.这不是人们期望事情发生的方式 - 内联与非内联不应该如此彻底地影响代码语义.


Alo*_*ave 9

Jonathan Schilling在文章中对此进行了恰当的回答:Extern Inlines By Default.

引用他关于这一变化的动机:

这一变化的直接动机是需要在同一次会议上通过的新模板编制模型; 但更普遍的是,人们认为改变默认值是一个时机已经到来的想法,并且这一变化在ANSI和ISO中得到了一致的批准.