Muss ein Referenztyp in der Konstruktorinitialisierungsliste initialisiert werden?

Als Selbstübung habe ich diesen einfachen Code geschrieben:

#include <iostream>

int gIndex = 3;

template <class T> class Array
{
public:
    explicit Array(int size);
    T& operator[](int i) { return m_data[i]; }
    T operator[](int i) const { return m_data[i]; }
    T getAnchorPoint() const { return m_data[m_anchor]; }
private:
    T* m_data;
    int m_size;
    int& m_anchor;
};

template <class T> Array<T>::Array(int size) : m_size(size), m_data(new T[size])
{
    memset(m_data, 0, size*sizeof(T));
    m_anchor = gIndex;
}

int main()
{
    Array<double> a(10);
    return 0;
}

Ich habe einen Kompilierungsfehler erhalten, der besagt:

error C2758: 'Array<T>::m_anchor' : must be initialized in constructor base/member initializer list

Es ist noch nie passiert, was mich dazu bringt, diese Frage zu stellen:

Muss ein Klassenmitglied-Referenztyp in der Konstruktor-Initialisierungsliste initialisiert werden?

Wenn ja warum? Hängt das irgendwie damit zusammen, dass ein Referenztyp niemals neu zugewiesen werden kann?

Gibt es weitere Typen, die in der Konstruktorinitialisierungsliste initialisiert werden müssen?

Antworten auf die Frage(3)

Ihre Antwort auf die Frage