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

Вы можете сделать это с помощью коллекции проекций :


    

Names of Users

11
задан Dynite 23 August 2010 в 07:23
поделиться

6 ответов

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

const int getInt();

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

22
ответ дан 3 December 2019 в 02:02
поделиться

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

const int f() {
   ...
}

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

4
ответ дан 3 December 2019 в 02:02
поделиться

Я соглашаюсь с ответом Juliano, Вы хотите, чтобы constness указателя был на сайте вызова.

Лучший способ сделать, что Вы ищете, состоит в том, чтобы иметь Ваш возврат функции ссылка константы на объект:

const MyClass& getMyClass()
{ 
  return myClass;
}

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

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

// 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();
5
ответ дан 3 December 2019 в 02:02
поделиться

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

0
ответ дан 3 December 2019 в 02:02
поделиться

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

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

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

4
ответ дан 3 December 2019 в 02:02
поделиться

Почему возвращают значение константы? Рассмотрите следующее (и извините лишенные воображения имена переменной):

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-значение" ошибка, которая кажется согласовывающейся с компилятором ARM, говоря Вам, что constness указателя бессмыслен - указателю нельзя присвоить так или иначе. Но для классов/структур, по-видимому, это должно хорошо присвоить возвращаемым значениям неконстанты.

0
ответ дан 3 December 2019 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: