我有以下代码:
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
是指针时,我可以在模板类型推导的整个主题上找到更多信息吗?
答案 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;