让我们看下面的代码:
template<class T,class Ref>
class test{
private:
T data;
public:
test(const T& x):data(x){};
const Ref operator*(){
return data;
};
}
int main(){
test<int,int&> t(1);
*t=2;
return 0;
}
上面的代码运行良好。函数operator*()
应该返回一个常量引用const Ref
,但是为什么它只返回了Ref
呢?
答案 0 :(得分:1)
函数
operator*()
应该返回const引用const Ref
,但是为什么它只返回Ref
?
请注意,对于const Ref
,const
直接在Ref
(即引用)上限定,而不是在引用的类型上。没有像const限定引用这样的事情,在这种情况下,const
限定符只是被忽略。这意味着const Ref
与Ref
(即int&
)相同。
Cv限定的引用格式错误,除非cv限定符 通过使用typedef-name([dcl.typedef] [temp.param])或decltype-specifier([dcl.type.simple]),在这种情况下 cv限定词将被忽略。 [示例:
typedef int& A; const A aref = 3; // ill-formed; lvalue reference to non-const initialized with rvalue
aref的类型是“对int的左值引用”,而不是“对左值的引用” const int”。 —示例]
答案 1 :(得分:-2)
编辑:好吧,如果您希望分配时出现编译时错误,可以这样编写:
template<class T>
class test {
private:
T data;
public:
test(const T& x):data(x){};
const T& operator*() { return data; }
};
int main(){
test<int> t(1);
*t=2; // error
return 0;
}