[英]constexpr pointer to constexpr static member in C++17
在以下代码中,我将地址指向静态 constexpr 成员:
struct component_type_data{};
template<class Derived>
class component{
private:
const constexpr static component_type_data type_data{};
public:
static constexpr const component_type_data* component_type = &type_data;
};
我的动机是为类型设置编译时唯一 ID。
这是有效的吗? 代码仅从 C++17 开始编译。 我可以使用该指针作为模板参数。
如果这是有效的,编译器如何事先知道地址?
更新 :
另外,跨 dll 边界会发生什么? 对于同一个静态成员,每个 dll 都会有自己的唯一地址,还是相同?
这是有效的吗?
是的; constexpr
指针对象允许包含任何静态存储期对象的地址。
代码仅从 C++17 开始编译。
在 C++17 之前, static constexpr
数据成员也需要类外定义:
template <class Derived>
constexpr const component_type_data component<Derived>::type_data;
template <class Derived>
constexpr const component_type_data* component<Derived>::component_type;
如果这是有效的,编译器如何事先知道地址?
如果您指的是数字地址:答案是编译器通常无法知道这一点,因为它可能直到链接时间或什至可能直到操作系统加载程序时才被分配。
然而,地址可以用作常量表达式的原因是编译器有效地象征性地表示它们,即“ component<int>::type_data
”。 如果您在编译时取消引用这样的指针,编译器就会知道结果是“左值引用component<int>::type_data
”。 因此,C++ 中的编译时计算确实非常复杂,并且涉及大量元数据(在 C++17 之后的世界中,我们对编译器的期望很高)。 请注意,一旦您尝试检查数字地址(即使用reinterpret_cast
),您将不再拥有在编译时可用的内容。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.