Почему мой возврат не имеет смысла?
Я пытаюсь использовать возвращаемый тип 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, говорящим вам, что константа Указатель не имеет смысла - указатель не может быть назначен в любом случае. Но для классов/структур, видимо, это нормально назначать значениям, не связанным с константой.