почему моя функция c ++ отказалась возвращать константную ссылку? - PullRequest
0 голосов
/ 03 марта 2019

Давайте посмотрим следующий код:

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 голосов
/ 03 марта 2019

Функция operator*() должна возвращать постоянную ссылку const Ref, но почему она только что вернула Ref?

Обратите внимание, что для const Ref, constквалифицируется на Ref (т. е. на ссылку) напрямую, а не на тип, на который ссылаются.Там нет таких вещей, как константная ссылка, в этом случае квалификатор const просто игнорируется.Это означает, что const Ref совпадает с Ref (то есть int&).

[dcl.ref] / 1

Cv-квалифицированные ссылкинеправильно сформированы, за исключением случаев, когда cv-квалификаторы вводятся с использованием typedef-name ([dcl.typedef], [temp.param]) или спецификатора decltype ([dcl.type.simple]), в этом случаеcv-квалификаторы игнорируются.[Пример:

typedef int& A;
const A aref = 3;   // ill-formed; lvalue reference to non-const initialized with rvalue

Тип aref: «lvalue ссылка на int», а не «lvalue ссылка на const int».- конец примера]

0 голосов
/ 03 марта 2019

Отредактировано: Хорошо, если вы хотите, чтобы при компиляции произошла ошибка во время компиляции, вы можете написать это так:

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