Chrono: разные выходные данные для одной и той же программы с использованием gcc

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

#include "date.h"
#include <iostream>
#include <chrono>
#include <string>
#include <set>
#include <ranges>
#include <algorithm>

using namespace date;
using namespace std;
using namespace std::chrono;

using time_point_t = std::chrono::sys_time<std::chrono::microseconds>;

time_point_t parse_tp(std::string s) {
    time_point_t tp;
    std::istringstream in(s);
    in >> parse("%Y%m%d-%T", tp);
    return tp;
}

int
main()
{
    auto tp = parse_tp("20240304-13:00:00.002");
    std::set<time_point_t> s = {tp, tp + std::chrono::seconds(1)};
    std::cout << *std::ranges::lower_bound(s, tp + std::chrono::seconds(1));
}
Компилятор Выход ГЦК 132024-03-04 13:00:01.002000багажник gcc2024-03-04 13:00:01.001999

Чем отличается результат?

Это ошибка?

Кстати, тот же результат здесь: godbolt.org/z/89Mh4zd5a

Super-intelligent Shade 06.03.2024 22:52

Спасибо за ваш ответ. Да, но, используя тот же код, я ожидал того же результата..

Peter 06.03.2024 23:00

Все еще расследуем. Но я думаю, что транковая версия может вызывать std::chrono::parse вместо date::parse. Пока не уверен.

Howard Hinnant 06.03.2024 23:02

Да, вот и все @HowardHinnant - мне немного странно, что, анализируя микросекунды вручную, а затем добавляя эту продолжительность к моменту времени, я получаю гораздо лучшие результаты - даже если не округлять до ближайшей миллисекунды, а оставаться на проанализированных микросекундах.

Ted Lyngmo 06.03.2024 23:05

Еще одно (а может и нет) интересное наблюдение: godbolt.org/z/cbsGYWxcq. clang (транк) с результатами libc++ согласуется с gcc 13/clang 17.

Super-intelligent Shade 06.03.2024 23:09

Я не думаю, что llvm еще реализует std::chrono::parse, так что это будет вызов date::parse.

Howard Hinnant 06.03.2024 23:10

Уместен ли здесь set? Разве это не запутанный способ сделать std::cout << (tp + 1s);? А что самое интересное, tp сам по себе уже отличается?

Barry 06.03.2024 23:41

Я не считаю, что set уместно. Я провел тестирование, просто транслируя tp.

Howard Hinnant 06.03.2024 23:47
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
75
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Версия gcc-13 вызывает date::parse, а версия gcc-trunk вызывает std::chrono::parse. Они должны делать то же самое, но являются независимыми реализациями.

Вчера я подал https://gcc.gnu.org/bugzilla/show_bug.cgi?id=114244, который находится в этой области, но может повлиять или не повлиять на этот конкретный пример.

См. комментарий ниже от Теда Люнгмо, где вы найдете хорошее объяснение такого поведения.

Причина, по которой ствол не выбирает date::parse, заключается в неоднозначности выбора date::from_stream перегрузки, которую можно обойти, используя вместо этого его напрямую date::from_stream(in, "%Y%m%d-%T", tp);.

Ted Lyngmo 06.03.2024 23:24

Другие вопросы по теме