1

考虑以下代码:

#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 ?

4

2 回答 2

5

const double*&是对指向 a 的指针的引用const double

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

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

inline Type* const & getptrc() const {return _ptr;}

conston 方法意味着您不会修改数据成员。要完成该合同,您必须返回一个常量指针,否则您可以修改数据成员_ptr。但是,在您使用 的另一种情况下getvalc,您已经通过返回 a 来履行该合同const double

于 2012-08-29T02:04:40.827 回答
1

MyClass<const double>,名称Type指的是const doublegetvalc()所以返回 a的成员函数Type&很好:它返回 a const double&,并且_val不能通过该引用进行修改。

Type*&对于;还有另一层间接性。虽然Typeis const double,但指向它的指针是可修改的;这就是编译器抱怨的原因:_ptr在 const 成员函数中是 const ,但该函数试图将其作为可修改的指针返回。

于 2012-08-29T02:07:58.097 回答