Squeak.ru - шаблоны программирования

Имеет ли u'\U0001ABCD' значение, определяемое реализацией, или оно неправильно сформировано?

Стандарт, похоже, имеет два разных ответа на литералы char16_t, содержащие символ, который не может быть представлен char16_t. Прежде всего, если значение кодовой точки не может быть представлено в 16 битах (т. е. оно не находится в базовой многоязычной плоскости (BMP)), то программа неправильно сформирована (§2.14.3/2):

Значение литерала char16_t, содержащего один c-char, равно его значению кодовой точки ISO 10646 при условии, что кодовая точка может быть представлена ​​одной 16-битной кодовой единицей. (То есть, при условии, что это базовая многоязычная кодовая точка плоскости.) Если значение не может быть представлено в пределах 16 бит, программа неправильно сформирована.

Поскольку \U0001ABCD — это один c-char1, но его нет в BMP, программа, содержащая его, некорректна.

Хорошо, но позже в той же главе говорится, что если значение выходит за пределы диапазона char16_t, определенного реализацией, то литерал имеет значение, определенное реализацией (§2.14.3/4):

Значение символьного литерала определяется реализацией, если оно выходит за пределы диапазона, определенного реализацией, определенного для [...] char16_t (для литералов с префиксом 'u') [...]

Поскольку определяемый реализацией диапазон для char16_t должен быть не менее 16 бит (чтобы иметь возможность хранить весь BMP), мы уже знаем, что программа плохо сформирована для значения, выходящего за пределы этого диапазона. Почему стандарт удосужился присвоить ему значение, определяемое реализацией?

1 Продукционные правила: c-char -> универсальное-символьное-имя -> \U hex-quad < em>шестигранник


  • Интересно, что gcc 4.7 отлично его компилирует. Просто предупреждение: символьная константа слишком длинная для своего типа [включено по умолчанию] 26.11.2012
  • Чтобы было ясно, char16_t c = u'\U0001ABCD'; неправильно сформировано, а char16_t s[] = u"\U0001ABCD"; нет, согласны? 26.11.2012
  • @KerrekSB Согласен. В частности, литералы character имеют неправильный формат. 26.11.2012
  • См. также: stackoverflow.com /вопросы/13547368/ 26.11.2012
  • Поведение gcc в прошлом было странным. Из-за требования, чтобы UCN вели себя так же, как буквальные символы, они заставили UCN вести себя так же, как последовательности UTF-8. И поведение последовательностей UTF-8 не было преднамеренным; он просто выпал из реализации. ideone.com/9cg69P. ИМХО, поведение clang имеет гораздо больше смысла (хотя, возможно, gcc 4.7 устранил все предыдущие проблемы). 26.11.2012
  • @LightnessRacesinOrbit Да, это мой другой вопрос. 26.11.2012

Ответы:


1

Программа имеет неправильный формат в соответствии с 2.14.3/2, что означает, что ошибка должна быть диагностирована. Нет необходимости проводить дальнейший анализ, поскольку реализации не требуются для завершения компиляции или создания исполняемого файла. Можно считать, что литерал по-прежнему имеет значение, но это вряд ли имеет значение.

(Хотя реализациям разрешено компилировать и выполнять неправильно сформированные программы. Поэтому я полагаю, что в этом случае тот факт, что символьный литерал по-прежнему указан как имеющий значение, будет иметь значение.)

25.11.2012
  • Уверены ли вы? Я использовал тот факт, что это не ответ на мой вчерашний вопрос. Я подумал, что это было просто спрятано в глупом абзаце. 26.11.2012
  • Новые материалы

    Угловая структура архитектуры
    Обратите внимание, что эта статья устарела, я решил создать новую с лучшей структурой и с учетом автономных компонентов: https://medium.com/@marekpanti/angular-standalone-architecture-b645edd0d54a..

    «Данные, которые большинство людей используют для обучения своих моделей искусственного интеллекта, поставляются со встроенным…
    Первоначально опубликовано HalkTalks: https://hacktown.com.br/blog/blog/os-dados-que-a-maioria-das-pessoas-usa-para-treinar-seus-modelos-de-inteligencia-artificial- ja-vem-com-um-vies-embutido/..

    Сильный ИИ против слабого ИИ: различия парадигм искусственного интеллекта
    В последние годы изучению и развитию искусственного интеллекта (ИИ) уделяется большое внимание и прогресс. Сильный ИИ и Слабый ИИ — две основные парадигмы в области искусственного интеллекта...

    Правильный способ добавить Firebase в ваш проект React с помощью React Hooks
    React + Firebase - это мощная комбинация для быстрого и безопасного создания приложений, от проверки концепции до массового производства. Раньше (знаете, несколько месяцев назад) добавление..

    Создайте API с помощью Python FastAPI
    Создание API с помощью Python становится очень простым при использовании пакета FastAPI. После установки и импорта вы можете создать приложение FastAPI и указать несколько конечных точек. Каждой..

    Веселье с прокси-сервером JavaScript
    Прокси-серверы JavaScript — это чистый сахар, если вы хотите создать некоторую общую логику в своих приложениях, чтобы облегчить себе жизнь. Вот один пример: Связь клиент-сервер Мы..

    Получить бесплатный хостинг для разработчиков | Разместите свой сайт за несколько шагов 🔥
    Статические веб-сайты — это веб-страницы с фиксированным содержанием и его постоянным содержанием. Но теперь статические сайты также обрабатывают динамические данные с помощью API и запросов...