Kex*_*iii 6 c++ static-members initialization-order language-lawyer c++17
下面的代码在同一个翻译单元中,并且是A::v在之后定义的x,为什么A::v没有初始化为“ok”?
#include <string>
#include <iostream>
std::string foo() {
return "OK";
}
std::string x = foo();
struct A {
static inline std::string v = x;
};
int main() {
std::cout << A::v << std::endl; // didn't print "OK", why?
}
Run Code Online (Sandbox Code Playgroud)
根据[basic.start.dynamic]/1,具有静态存储持续时间的非内联非模板化非块变量具有“有序”初始化,而具有静态存储持续时间的内联非模板化非块变量具有“部分有序” “初始化。
根据[basic.start.dynamic]/3,在以下情况下,我们仅在两个具有静态存储持续时间的非块变量之间有初始化顺序保证:
因此,如果非内联变量在内联变量之前定义,我们就没有初始化顺序保证。当内联变量是第一个时,我们只有初始化顺序保证。所以在这段代码中,v可以在之前初始化x,导致未定义的行为。
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |