提问人:Oersted 提问时间:11/15/2023 更新时间:11/15/2023 访问量:50
模板类中的静态成员初始化和专用化:const 和 constexpr 的区别
Static member initialization and specialization in template classes: differences between const and constexpr
问:
在实验上,我知道如何声明/初始化/定义各种类型的数据成员(主要是通过阅读编译器诊断),但我意识到我并不真正理解这些机制背后的规则,尤其是模板类的数据成员之间的区别。static
const
constexpr
static
假设我有以下文件。
模板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。为什么不能以相同的方式管理静态数据成员?constexpr
static
const
static
constexpr
static data
const
constexpr
答: 暂无答案
评论
const
和constexpr
静态
数据成员?const
constexpr
static