首先,我质疑向数据成员授予哪些链接
,我的假设是正确的,MM 回答也可以,
我仔细检查了标准,是的,链接是正确的,就像我和 MM 上面所说的
但是正如 MM 提到的,我误解了哪个是声明或定义
。这有点离题,但我自己为将来阅读此内容的人回答
[1] 如果涉及非静态数据成员
struct A {
int var1; // definition (initial value is 0)
int var2 = 100; // definition (initial value is 100)
};
[2] 如果涉及静态常量
struct A {
static const int var1 = 100; // declaration (initial value is 100)
static const int var2; // declaration (initial value is 0)
};
const int A::var1; // definition (an option for odr-used situation)
const int A::var2 = 10; // definition
[3] 如果涉及静态 constexpr
constexpr数据成员很有趣并且工作方式不同
,因为从 C++17 开始,数据成员constexpr隐含inline
并inline实际定义了它
加上每个inline翻译单元中的每个数据成员都保证只有一个相同的定义
(https://eel.is/c++draft/depr.static.constexpr)
struct A {
static constexpr int n = 5; // definition (declaration in C++ 2014)
};
constexpr int A::n; // redundant declaration (definition in C++ 2014)
例如,如果我有 2 个如下翻译单元
// foo.cpp
#include <iostream>
class AAA {
public:
static constexpr int var = 10;
};
void foo() {
std::cout << &AAA::var << std::endl;
}
// main.cpp
#include <iostream>
class AAA {
public:
static constexpr int var = 10;
};
void foo();
int main() {
std::cout << &AAA::var << std::endl;
foo();
}
结果如下
$ g++ -std=c++17 main.cpp foo.cpp
$ ./a.out
0x564ba82a3a54
0x564ba82a3a54