考虑以下标题并假设它在多个TU中使用:
static int x = 0;
struct A {
A() {
++x;
printf("%d\n", x);
}
};
Run Code Online (Sandbox Code Playgroud)
正如这个问题所解释的那样,这是ODR违规,因此也就是UB.
现在,如果我们的函数引用非对象并且我们不在该函数中使用它(加上其他条款),则不存在ODR违规,因此这在头文件中仍然可以正常工作:inlinevolatile const
constexpr int x = 1;
struct A {
A() {
printf("%d\n", x);
}
};
Run Code Online (Sandbox Code Playgroud)
但如果我们确实碰巧使用它,我们又回到UB的第一个方面:
constexpr int x = 1;
struct A {
A() {
printf("%p\n", &x);
}
};
Run Code Online (Sandbox Code Playgroud)
因此,鉴于我们现在有inline变量,指南是否应该在标题中标记所有namespace变量inline以避免所有问题?
constexpr inline int x = 1;
struct A {
A() {
printf("%p\n", &x);
}
};
Run Code Online (Sandbox Code Playgroud)
这似乎也更容易教,因为我们可以简单地说" inline标题中的所有内容"(即函数和变量定义),以及"从不static …