为什么我还必须在.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 )