跨翻译单元的静态constexpr定义

时间:2019-07-16 18:42:41

标签: c++ static constexpr definition translation-unit

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

0 个答案:

没有答案