静态内联函数中的函数局部静态对象不共享
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
所以观察到的行为符合标准。
我在 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
所以观察到的行为符合标准。