引用初始化无效:指针和值之间的差异?

Vin*_*ent 1 c++ pointers const reference

考虑以下代码:

#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;
}
Run Code Online (Sandbox Code Playgroud)

GCC为getptrc函数生成错误invalid initialization of reference of type 'const double*&' from expression of type 'const double* const'.但函数getvalc编译得很好.我不明白getvalc和getptrc之间的区别在于错误的起源.

错误的原因是什么以及为什么我不能为返回指针引用的函数设置const?

Jes*_*ood 5

const double*&是指向a的指针const double.

const double* const是一个指向a的const指针const double.

这意味着您必须返回一个常量指针.

inline Type* const & getptrc() const {return _ptr;}
Run Code Online (Sandbox Code Playgroud)

conston methods意味着您不会修改数据成员.要填充该合同,您必须返回一个常量指针,否则,您可以修改该数据成员_ptr.但是,在您的其他情况下getvalc,您已经通过返回a已经完成了该合同const double.