bla.h中包含以下内容:
#include <iostream>
static inline void bla() {
static int x;
std::cout << "bla @ " << (uintptr_t)bla << ": x @ " << &x << std::endl;
}
然后从2个单独的转换单元调用bla(),得到以下输出:
bla @ 94796100194693: x @ 0x56376fe10178
bla @ 94796100194897: x @ 0x56376fe10180
阅读内联说明符后,这让我有些惊讶。
它说:
在内联函数中,
- 所有函数定义中的局部函数静态对象在所有转换单元之间共享(它们均引用一个转换单元中定义的同一对象)
在该句子中,它并不将其限制为“具有外部链接(例如,未声明为静态) ”,就像在之前的段落中那样,“在每个翻译单元中都有相同的地址”。
所以我希望输出显示的不同地址,bla
但显示相同的地址x
。
这是g ++中的错误吗?
注意:这特定于C ++ 17中内联的更改含义。
正如Igor Tandetnik所评论的那样,该错误出在cppreference.com上,因为它们忽略了该标准的重要部分:
C ++标准的实际文本在[dcl.inline] / 6中有此注释:“具有外部链接的内联函数中的静态局部变量始终引用同一对象。”
强调我的。– Igor Tandetnik 10月20日4:12
因此,观察到的行为符合标准。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句