为什么我的C ++函数拒绝返回const引用?

时间:2019-03-03 06:52:15

标签: c++ reference const

让我们看下面的代码:

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

2 个答案:

答案 0 :(得分:1)

  

函数operator*()应该返回const引用const Ref,但是为什么它只返回Ref

请注意,对于const Refconst直接在Ref(即引用)上限定,而不是在引用的类型上。没有像const限定引用这样的事情,在这种情况下,const限定符只是被忽略。这意味着const RefRef(即int&)相同。

[dcl.ref]/1

  

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; 
}