在c++模板中::*(作用域op后面的星号)是什么意思?

What does ::* (asterisk after scope op) means in C++ template?

本文关键字:意思 是什么 op c++ 作用域      更新时间:2023-10-16

请帮助我理解来自Facebook Pop的代码片段:PopVector.h

模板类Vector2包含一个静态成员_v,它看起来像是Vector2实例的备份数据:

private:
    typedef T Vector2<T>::* const _data[2];
    static const _data _v;

_v由以下行实例化:

template<typename T>
  const typename Vector2<T>::_data Vector2<T>::_v = { &Vector2<T>::x, &Vector2<T>::y };

_v用于实现索引操作符:

const T& operator[](size_t i) const { return this->*_v[i]; }
T& operator[](size_t i) { return this->*_v[i]; }

我不熟悉这个代码模式,有几个问题:

    typepedef行是什么意思?我看不懂Vector2<T>::*
  1. 为什么_v必须是静态成员?它似乎不是跨实例共享的,这并不遵循c++ AFAICT中的静态语义。

无论在模板中还是在其他地方,::*都只是一个c++令牌可在上下文中的类型表达式中使用<我> class_name :: *。它声明一个指向成员的指针。

在您的示例中,typedef表示_data是的别名指向Vector2<T>中具有类型的成员的const指针T const[2] .

编辑:

我得到了实际定义错误:_data是指向T类型的Vector2<T>成员的const指针数组[2]的别名。这在实例化中很明显,对象初始化为两个指向成员的指针。