静态内联函数中的函数局部静态对象不共享

Function-local static objects in static inline functions aren't shared

我在 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

看完inline specifier后,这让我有点惊讶。

它说:

In an inline function,

  • Function-local static objects in all function definitions are shared across all translation units (they all refer to the same object defined in one translation unit)

在那句话中,它并不像在“”之前的段落中那样将其限制为“具有外部链接(例如未声明为静态)”它在每个翻译单元中都有相同的地址”。

所以我希望输出显示 bla 的不同地址,但 x.

的地址相同

这是 g++ 中的错误吗?

注意:这是特定于C++17中内联含义的变化。

正如 Igor Tandetnik 评论的那样,错误出现在 cppreference.com 上,因为他们遗漏了标准的重要部分:

The actual text of the C++ standard has this note in [dcl.inline]/6: "A static local variable in an inline function with external linkage always refers to the same object."

Emphasis mine. – Igor Tandetnik Oct 20 at 4:12

所以观察到的行为符合标准。