Nano Hash - криптовалюты, майнинг, программирование

Почему квалификатор типа для возвращаемого типа бессмыслен?

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

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

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

c c++
22.10.2009

  • Это только у меня или в этом вопросе нет ясности? 22.10.2009
  • @ Жан-Лу: Я согласен с тем, что сама тема вопроса несколько расплывчата, но название вопроса точно передает его смысл. 22.10.2009

Ответы:


1

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

  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, константа игнорируется. Итак, это ошибка:

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

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

22.10.2009
  • Я рекомендую всегда использовать константу в конце (char const * const), так как это единственный способ использовать const последовательно. Тем не менее, в этом отношении меня намного меньше ... 22.10.2009
  • @DevSolar: Большинство гуру (например, Саттер), похоже, согласны с вами и помещают квалификаторы ПОСЛЕ типа (class const &, class volatile). 22.10.2009
  • @DevSolar, просто чтобы уточнить: они не согласны с вами по поводу последней завершающей const. Они могут согласиться с вашей первой константой, которая появляется после имени типа. 01.03.2010
  • @ litb - я не получил этого комментария. Вы имеете в виду, что они (гуру?) Не согласны со мной и в int foo() const помещают константу в другое место? / меня смущает. 02.03.2010
  • @Dev, я имею в виду, они не согласны с тем, что int const f() - это хорошо. Они будут опускать последнюю завершающую константу (обратите внимание, что это не то же самое, что int f() const - это совсем другое). Матье (и я тоже) согласен с вами в том, что const после того, как тип в порядке (например, int const a = 0;). Но не то, чтобы это было хорошо в качестве конечной константы в типах возвращаемых функций (как указывает ваш комментарий может - поэтому я хотел уточнить). 02.03.2010
  • Ах ... теперь я понял. На самом деле я имел в виду не замыкающую константу возвращаемого типа функции, а просто всегда использовать замыкающую const , где константа подходитint const f() - нет). 02.03.2010

  • 2

    В C, поскольку значения, возвращаемые функцией, и уточняющие значения бессмысленны.
    В 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 */
    
    22.10.2009
  • Обратите внимание, что для типов классов const для возвращаемых значений не бессмысленно, поскольку вам разрешено вызывать функции-члены для изменения неконстантных значений r. (У нас только что было это здесь со строками на днях: (s1+s2).append(s3).) Как обычно, ответ litb объясняет все это как подробно, так и правильно. 22.10.2009
  • Я имел в виду свой ответ, касающийся только C. Обновлено, чтобы отразить это. 22.10.2009
  • Ах, он задал вопрос о C / C ++. (Странный язык, это.) Извините, я этого тоже не видел. 24.10.2009

  • 3

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

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

    char const * foo( ){
    

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

    10.04.2014
  • Я понимаю, что это постоянный указатель на символ, а не указатель на постоянный символ 23.12.2016
  • Нет, на самом деле @ user1076543 прав, это указатель на константу char, поскольку char const * и const char * одинаковы. Постоянный указатель на символ будет char * const. 10.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..