模板类中的静态成员初始化和专用化:const 和 constexpr 的区别

Static member initialization and specialization in template classes: differences between const and constexpr

提问人:Oersted 提问时间:11/15/2023 更新时间:11/15/2023 访问量:50

问:

在实验上,我知道如何声明/初始化/定义各种类型的数据成员(主要是通过阅读编译器诊断),但我意识到我并不真正理解这些机制背后的规则,尤其是模板类的数据成员之间的区别。staticconstconstexprstatic

假设我有以下文件。

模板ODR.hpp

template <typename T>
struct TData {
    static T m_Value;
    static constexpr T m_kValue = T(3.14);
};

TemplateDoubleSpecialization.hpp

template <>
double TData<double>::m_Value;

// cannot gives a different specialization for the constexpr
// KO: template<> double TData<double>::m_kValue = 2.72;

模板双专业化.cpp

template <>
double TData<double>::m_Value = 3.14;

测试ODRUse#N.cpp

void TestODRUse#N() {
    std::cout << TData<double>::m_Value << '\n';
    std::cout << TData<double>::m_kValue << '\n';
}

main.cpp

int main() {
    TestODRUse1();
    TestODRUse2();  // testing for ODR violations
}

为了清楚起见,特意省略了其他琐碎的头文件和指令,这些文件和指令需要作为不同文件之间的粘合剂。 此处提供了完整的示例。#include

对于模板来说,数据似乎有点特殊:可以为每个专业化重新定义一个数据成员,但这并不适用于 .例如,我们必须求助于 Specialize static constexpr data member。为什么不能以相同的方式管理静态数据成员?constexprstaticconststaticconstexprstatic dataconstconstexpr

C++ 模板 language-lawyer constexpr static-members

评论

0赞 Chukwujiobi Canon 11/15/2023
你正在尝试将苹果与橙子进行比较。 在成为数据成员的保护伞下。我之所以得出这个结论,是因为你提到了为什么不能以相同的方式管理 constconstexpr 静态数据成员?constconstexprstatic

答: 暂无答案