次のコードを検討します。
#include <iostream>
#include <vector>
template<typename Type> class MyClass
{
public:
MyClass(Type* ptr) : _ptr{ptr}, _val{*ptr} {;}
inline Type*& getptr() {return _ptr;}
inline Type*& getptrc() const {return _ptr;}
inline Type& getval() {return _val;}
inline Type& getvalc() const {return _val;}
protected:
Type* _ptr;
Type _val;
};
int main()
{
std::vector<double> v = {0, 1, 2};
MyClass<const double> x(&v[0]);
x.getval();
x.getvalc(); // <- OK
x.getptr();
x.getptrc(); // <- ERROR : "invalid initialization of reference of type 'const double*&' from expression of type 'const double* const'"
return 0;
}
GCCは、getptrc関数のエラーを生成しますinvalid initialization of reference of type 'const double*&' from expression of type 'const double* const'
。しかし、関数getvalcはうまくコンパイルされます。エラーの原因であるgetvalcとgetptrcの違いがわかりません。
エラーの原因は何ですか?また、ポインターへの参照を返す関数にconstを設定できないのはなぜですか?