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?