Подтвердить что ты не робот

Почему спецификатор типа по типу возврата не имеет смысла?

Скажем, у меня есть этот пример:

char const * const
foo( ){
   /* which is initialized to const char * const */
   return str;
}

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

4b9b3361

Ответ 1

Как вы его написали, он сказал, что значение возвращаемого указателя равно const. Но значения класса non-class не изменяются (унаследованы от C), и, таким образом, стандарт говорит, что значения класса non-class никогда не являются const-qual (самый правый const был проигнорирован даже указанным вами вами), поскольку const будет немного избыточным, Его не пишите - например:

  int f();
  int main() { f() = 0; } // error anyway!

  // const redundant. returned expression still has type "int", even though the 
  // function-type of g remains "int const()" (potential confusion!)
  int const g(); 

Обратите внимание, что для типа "g" константа значительна, но для выражений rvalue, генерируемых из типа int const, const игнорируется. Таким образом, следующая ошибка:

  int const f();
  int f() { } // different return type but same parameters

Мне неизвестно, что вы могли бы наблюдать "const", кроме как получить тип "g" (и передать &f в шаблон и вывести его тип, например). Наконец, обратите внимание, что "char const" и "const char" означают один и тот же тип. Я рекомендую вам разобраться с одним понятием и использовать его во всем коде.

Ответ 2

В C, поскольку возвращаемые значения функции и квалификационные значения не имеют смысла.
В С++ это может быть иначе, проверьте другие ответы.

const int i = (const int)42; /* meaningless, the 42 is never gonna change */
int const foo(void); /* meaningless, the value returned from foo is never gonna change */

Только объекты могут быть осмысленно квалифицированы.

const int *ip = (const int *)&errno; /* ok, `ip` points to an object qualified with `const` */
const char *foo(void); /* ok, `foo()` returns a pointer to a qualified object */

Ответ 3

Ни один из предыдущих ответов не отвечает на вопрос "правильный способ сделать это".

Я считаю, что ответ на этот вопрос:

char const * foo( ){

в котором говорится, что вы возвращаете указатель на постоянный символ.