Вопрос о конкретном размещении ключевого слова const в перегруженном -> операторе - PullRequest
0 голосов
/ 13 сентября 2018

Рассмотрим следующий «умный указатель» как класс.Он содержит указатель на другой класс, который реализовал конструктор виртуальной копии clone().

Я хочу перегрузить operator ->.Мой источник показывает две реализации, const и не-const, с которыми я в порядке.Я понимаю, что последний const означает, что он не может вносить изменения в базовые переменные поля, а первый - тип возвращаемого значения const.Но что означает ключевое слово между типом возвращаемого значения и оператором?то есть средний.

class myClass
{
public:
    myClass(const SomeClass& inner)   {DataPtr = inner.clone();}
    ~MyClass() {delete DataPtr;}
    SomeClass* operator->() {return DataPtr;} 
    const SomeClass* const operator->() const {return DataPtr;}
private:
    SomeClass* DataPtr;
};

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

и первое, что тип возвращаемого значения const

На самом деле, нет.Первый (т. Е. Первый const из const SomeClass* const) означает, что тип возвращаемого значения - указатель на const.Это означает, что указанный объект нельзя изменить с помощью указателя.

Но что означает ключевое слово между типом возвращаемого значения и оператором?

Это часть типа.

const в имени типа всегда применяется к тому, что находится слева (кроме случаев, когда const является самым левым токеном, в этом случае он применяется справа).В этом случае есть * на левой стороне const, который мы рассматриваем.Это означает, что указатель является константным, то есть сам указатель не может быть изменен.

Не имеет смысла возвращать константное значение неклассового типа (в данном случае константный указатель), поскольку константность не имеетвлияние на поведение программы.Некоторые компиляторы выдадут предупреждение, если вы сделаете это.Я рекомендую удалить рассматриваемое const.

Даже для типов классов, хотя в некоторых случаях это может иметь значение, я не знаю ни одного практического варианта использования для возврата значения const.Однако возвращение указателя или ссылки на const имеет смысл.

0 голосов
/ 13 сентября 2018

const SomeClass* const

В этом случае const является частью возвращаемого типа. Это может быть действительный код C. Как всегда, читайте справа налево:

  • const указатель на экземпляр const SomeClass.

Это означает, что сам указатель равен const и что через него нельзя изменить pointee. Обратите внимание, что самый правый const в вашем примере бесполезен, так как вы возвращаете по значению: это то же самое, что и возврат const int.

...