为什么我还必须在 .cpp 文件中写入静态 constexpr 的定义?
我正在使用 C++11 开发CLion 2018.3.4 。
我试图在这里和那里弄乱代码,但我想不出答案。
在翻译单元中,静态 constexpr 成员在声明时被初始化,因此在头文件中。虽然这应该足够了,但链接器并不认为这是一个正确的定义,为了使该成员在所有翻译单元中真正唯一,我们必须在 .cpp 文件中提供一个定义。
//.h 文件
class Shape {
public:
virtual void getArea() = 0;
const double getPi() {
return pi;
}
private:
static constexpr double pi = 3.15926535898;
};
//.cpp 文件
constexpr double Shape::pi; //why this?
我认为,如果我们删除 .cpp 文件中的定义,则可以在其他翻译单元中重新定义该成员。
额外的小问题: 是否正确地说,在 .cpp 文件中写入的成员实际上是全局且恒定的,而在 .cpp 文件中没有写入的成员仍然是全局但不是静态的?
我不完全了解确切的过程以及为什么会发生这种情况。
(我在某处读到在 C++ 17 中这有一些演变,但我正在研究 C++ 11)