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

продолжительность хранения базовых символьных данных с определяемым пользователем строковым литералом

Быстрая настройка: я хочу передавать строки в своей программе как указатель и размер. У меня есть класс String и пользовательский литерал для построения литеральных строк:

struct String { const char *ptr; size_t sz; };

inline constexpr String operator "" _string(const char *s, size_t sz) {
  return {s, sz};
}

int main() {
  auto s = "hello"_string;
  s.ptr[0]; //<-- is this access guaranteed to work?
}

Указывает ли стандарт, что аргумент, передаваемый моему пользовательскому литеральному оператору, имеет статическую продолжительность? то есть приведенный выше код фактически эквивалентен написанию:

int main() {
  String s{"hello", 5};
}

или компилятору/компоновщику разрешено оставлять меня с оборванным указателем, когда я использую пользовательский литерал?

(Раздел 2.13.8 N4527, похоже, ничего не говорит о классе хранения аргумента для определяемых пользователем строковых литеральных операторов. Любые указатели на соответствующие разделы стандарта будут оценены.)


  • Раздел 2.13.8, также известный как [lex.ext]p5, похоже, говорит, что аргумент является строковым литералом, и они имеют статическую продолжительность хранения. 18.09.2015
  • @dyp Я не уверен, что это ясно, я продолжаю повторять это взад и вперед 18.09.2015
  • @ShafikYaghmour Вот почему я не опубликовал это как ответ;) 18.09.2015
  • @ShafikYaghmour Какое место для сомнений? Что мне не хватает? Он называет их строковыми литералами, строковые литералы имеют статическую продолжительность хранения, не так ли? 18.09.2015

Ответы:


1

Из [lex.ext]:

Если L — это определяемый пользователем строковый литерал, пусть str будет литералом без его суффикса ud. и пусть len будет числом единиц кода в str (т. е. его длина без завершающего нулевого символа). Литерал L обрабатывается как вызов формы:

operator "" X (str , len )

Из [lex.string]:

Вычисление строкового литерала приводит к объекту строкового литерала с длительностью статического хранения, инициализированному из заданных символов, как указано выше.

So:

"hello"_string;

эквивалентно:

operator "" _string("hello", 5)

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

18.09.2015
  • формы кажется немного расплывчатым, здесь не сказано эквивалентно. Во всяком случае, я согласен с основной идеей. 18.09.2015
  • @dyp Да, в других контекстах в стандарте формы обычно представлена ​​синтаксическая структура (например, выражение формы E1 op= E2 эквивалентно E1 = E1 op E2 ... ). Плохой выбор формулировки imo. 18.09.2015
  • Однако есть [dcl.fct.def.general]p8, который не является синтаксическим; это может означать эквивалентно в этом случае. 18.09.2015
  • Стандарт кажется достаточно ясным, когда вы его произносите. Принято, спасибо! 18.09.2015
  • Новые материалы

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

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

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

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

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

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

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