Почему мой возврат не имеет смысла?

Я пытаюсь использовать возвращаемый тип const MyClass * const. Однако я получаю предупреждение:

Предупреждение: # 815-D: тип классификатора по типу возврата не имеет смысла.

Является ли это недействительным типом? Я хочу указатель, который не может быть изменен, и я хочу, чтобы оно не изменилось.

Ответ 1

У самого указателя есть тип значения, поэтому не имеет смысла сделать его const. Функция вызывающего абонента с возвращаемым значением не может быть ограничена вызываемой функцией. Это похоже на попытку определить что-то вроде:

const int getInt();

getInt(), в этом случае просто возвращает значение int (а не ссылку). Он переходит в регистр, затем функция вызывающего абонента получает его и делает все, что ему нужно.

Ответ 2

Я согласен с ответом Джулиано, вы хотите, чтобы константа указателя находилась на сайте вызова.

Лучший способ сделать то, что вы ищете, - это вернуть вашу функцию const к объекту:

const MyClass& getMyClass()
{ 
  return myClass;
}

По определению ссылки не могут быть изменены, поэтому вам будет лучше.

Конечно, это не сработает, если ваша функция пытается создать объект MyClass. В этом случае вы можете просто переместить дополнительный const на сайт вызова.

// function definition
const MyClass* createMyClass()
{ 
  return new MyClass("I Love C++");
}

// use of a const pointer to a MyClass which is const
const MyClass* const myClassInstance = creatMyClass();

Ответ 3

Почему вас беспокоит изменение указателя? Выполнение этого похоже на высказывание:

const int f() {
   ...
}

Значение, возвращаемое f(), является копией - изменение ничего не меняет, поэтому в const есть константа.

Ответ 4

Один простой способ убедиться, что вы определяете тип возврата, который вы хотите, - всегда добавлять модификаторы справа (в противоположность левой) стороне исходного типа.

MyClass                 // MyClass object
MyClass const           // MyClass object which can't be modified
MyClass const &         // reference of an unmodifiable MyClass object 
MyClass const *         // pointer to an unmodifiable MyClass object
MyClass const * const   // unmodifiable pointer to an unmodifiable MyClass object
MyClass const * const & // reference of an unmodifiable pointer to an unmodifiable MyClass object

Это должно помочь убедиться, что ваши возвращаемые типы никогда не будут бессмысленными:)

Ответ 5

спецификатор const не означает ничего, потому что вы возвращаете указатель

Ответ 6

Зачем возвращать значение const? Рассмотрим следующее (и, пожалуйста, извините имена невообразимых переменных):

struct A { int a; };

A operator+(const A& a1, const A& a2) 
{
    A a3 = { a1.a + a2.a };
    return a3;
}

Учитывая это объявление operator+, я могу сделать следующее:

A a = {2}, b = {3}, c = {4}, d = ((a+b) = c);

Правильно, я просто назначил временную A, которая была возвращена operator+. Результирующее значение d.a равно 4, а не 5. Изменение типа возврата operator+ на const A предотвращает это назначение, в результате чего выражение (a+b) = c генерирует ошибку компилятора.

Если я пытаюсь назначить указатель или целое число, возвращаемое функцией, мой компилятор (MSVC) генерирует ошибку "левый операнд должен быть l-value", что, похоже, согласуется с компилятором ARM, говорящим вам, что константа Указатель не имеет смысла - указатель не может быть назначен в любом случае. Но для классов/структур, видимо, это нормально назначать значениям, не связанным с константой.