0

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

4

0 回答 0