如果模板参数是指针,则在getter上删除const限定符

时间:2016-03-20 16:57:14

标签: c++ templates pointers gcc

我有以下代码:

template <typename T>
struct Val
{
    T val;

    const T& get() const { return val; }
    void set(const T& newVal) { val = newVal; }
};

int& f(const Val<int>& val)
{
    return val.get();
}

int* g(const Val<int*>& val)
{
    return val.get();
}

int main()
{
    Val<int> val1;
    f(val1);

    Val<int*> val2;
    g(val2);

    return 0;
}

使用以下消息在gcc中编译失败:

main.cpp: In function 'int& f(const Val<int>&)':
main.cpp:78:20: error: invalid initialization of reference of type 'int&' from expression of type 'const int'
     return val.get();
                    ^
main.cpp:79:1: warning: control reaches end of non-void function [-Wreturn-type]

这完全没问题,但为什么g()产生的错误不一样?出于某种原因,为什么在const T&上删除const限定符时,T是指针?

我试图找到一些资源,但似乎很难找到。我知道迈耶斯在他最新的书中写了一些东西,但我无法访问那本书。有人可以指向我的资源或关键字,当T是指针时,我可以在模板类型推导的整个主题上找到更多信息吗?

1 个答案:

答案 0 :(得分:0)

  

为什么,出于某种原因,当T是指针时,const T&amp;中的const限定符被删除了?

因为您按值返回指针,而不是通过引用返回指针。从const指针初始化一个指针是完全没问题的(注意它是const的指针,而不是它们指向的东西。)你做的就是这样做:

int* const p0 = nullptr; // const pointer
int* p1 = p0;            // copy to non-const is OK

如果你要从const指针初始化poiter的非成本引用,你会得到与第一种情况类似的错误:

// error: binding of reference to type 'int *'
// to a value of type 'int *const' drops qualifiers
int*& p1 = p;