C++ 0x, Компилятор сцепляется и трудно кодированные функции языков

getTimeZoneOffset () и toLocaleString хороши для основной работы даты, но если Вы нуждаетесь в реальной поддержке часового пояса, смотрите TimeZone.js mde.

существует еще несколько опций, обсужденных в ответе на этот вопрос

5
задан Community 23 May 2017 в 11:48
поделиться

2 ответа

Я не ошибаюсь, полагая, что эти новые возможности действительно очень сильно зависят от кода компилятора

Они действительно сильно зависят от компилятора. Независимо от того, нужно ли вам включать заголовок или нет, дело в том, что в обоих случаях синтаксис будет ошибкой синтаксического анализа с сегодняшними компиляторами. for (:) не совсем вписывается в современный стандарт, где единственной допустимой конструкцией является for (;;)

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

Поддержка должна быть реализована в компиляторе, но для ее работы необходимо включить системный заголовок. Это может служить нескольким целям, в случае списков инициализации, он вводит тип (интерфейс для поддержки компилятора) в область видимости для пользователя, так что вы можете иметь способ его использовать (подумайте, как va_args находится в C). В случае for на основе диапазона (что является просто синтаксическим сахаром) вам необходимо включить Range в область видимости, чтобы компилятор мог выполнять свою магию. Обратите внимание, что стандарт определяет для оператора (for-range-declare: expression) как эквивалент ([6.5.4] / 1 в черновике):

{ 
   auto && __range = ( expression ); 
   for ( auto __begin = std::Range<_RangeT>::begin(__range), 
         __end = std::Range<_RangeT>::end(__range); 
         __begin != __end; 
         ++__begin ) { 
      for-range-declaration = *__begin; 
      statement 
   } 
} 

Если вы хотите использовать его только в массивах и контейнеры STL, которые могут быть реализованы без концепции Range (не в смысле C ++ 0x), но если вы хотите расширить синтаксис до пользовательских классов (ваших собственных контейнеров), компилятор может легко зависеть от на существующем шаблоне Range (с вашей возможной специализацией). Механизм зависимости от определяемого шаблона эквивалентен требованию статического интерфейса в контейнере.

Большинство других языков пошли в направлении требования обычного интерфейса (например, контейнера, ...) и использования полиморфизма времени выполнения для этого . Если бы это было сделано на C ++, весь STL пришлось бы пройти через серьезный рефакторинг, поскольку контейнеры STL не имеют общей базы или интерфейса, и они не готовы к полиморфному использованию.

Если таковые имеются, текущие стандарт не будет неполным к моменту выхода.

3
ответ дан 15 December 2019 в 01:03
поделиться

Это просто синтаксический сахар. Компилятор расширит данные синтаксические конструкции в эквивалентные выражения C ++, которые напрямую ссылаются на стандартные имена типов / символов.

Это не единственная сильная связь, которую современные компиляторы C ++ имеют между своим языком и «внешним миром». Например, extern «C» - это своего рода языковой прием, позволяющий приспособиться к модели связывания C. Ориентированные на язык способы объявления локального хранилища потока неявно зависят от множества хакерских приемов RTL.

Или посмотрите на C. Как получить доступ к аргументам, переданным через ... ? Вам нужно полагаться на стандартную библиотеку; но здесь используется магия, которая очень сильно зависит от того, как именно компилятор C размещает кадры стека.

ОБНОВЛЕНИЕ:

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

1
ответ дан 15 December 2019 в 01:03
поделиться
Другие вопросы по тегам:

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