0

我假设一个类的数据成员具有如下所示的链接(或没有链接)
是正确的吗?

class AAA {
public:                          // this doesn't matter

  int var1;                      // no linkage
  const int var2 = 0;            // no linkage

  static int var3;               // external linkage (declaration)
  static const int var4 = 0;     // external linkage (declaration + definition)

};

int AAA::var3 = 0; // external linkage (definition)
4

1 回答 1

0

首先,我质疑向数据成员授予哪些链接
,我的假设是正确的,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
于 2020-04-13T15:39:10.647 回答