накопилось несколько вопросов по реализации chrono::duration. Может кто видел в стандарте, или знает почему именно так?
почему дефолтный конструктор не инициализирует count нулём? Пишешь std::chrono::seconds s и получаешь UB, потому как не понятно что вернёт s.count(). Такая реализация в gcc и msvc — не похоже на ошибку. Это притом, что есть функция zero(), которую можно вполне использовать для инициализации. И даже если не хочется инициализировать нулём, почему просто не убрать этот небезопасный конструктор?
почему не переопределена функция хеширования? То есть не могу написать std::unordered_set<std::chrono::seconds>.
чем дальше, тем больше не понимаю идиомы "don't pay for what you don't use" Два тика процессора сэкономили, а сколько людей уже забыли проинициализировать std::chrono::duration и убили время на поиск ошибки, их не волнует.
Здравствуйте, reversecode, Вы писали:
R>насколько я помню в совеременном языке С++ R>не реккомендуется использовать не инициализированные переменные
да, конечно не рекомендуется. Но когда вы используете производный тип с дефолтным конструктором, вы ожидаете что он произведёт какие-то инициализирующие действия. Например:
std::string s; // ожидаем, что s проинициализировано. На произвольный участок памяти строка не указывает
std::vector<int> v; // тоже самое. Но это конечно всё примеры с контейнерными типами. У них конечно своя специфика. Но теперь возьмём другой "не контейнерный" тип
std::complex<float> c; // вуаля, по нулям. Получается разработчик std::complex согласен взымать с вас плату за то, что вы не используете.
напишите вопрос напрямую walter-у brown-у
он по моему имеет отношение к дизайну chrono библиотеки
мне он когда то отвечал по моим вопросам
и когда ответит вам, поделитесь с нами результатом
Здравствуйте, sergii.p, Вы писали:
SP>накопилось несколько вопросов по реализации chrono::duration. Может кто видел в стандарте, или знает почему именно так? SP>
SP> почему дефолтный конструктор не инициализирует count нулём? Пишешь std::chrono::seconds s и получаешь UB, потому как не понятно что вернёт s.count(). Такая реализация в gcc и msvc — не похоже на ошибку. Это притом, что есть функция zero(), которую можно вполне использовать для инициализации. И даже если не хочется инициализировать нулём, почему просто не убрать этот небезопасный конструктор? SP> почему не переопределена функция хеширования? То есть не могу написать std::unordered_set<std::chrono::seconds>. SP>
код вроде
std::chrono::seconds buffer[MAX_BUFFER_LENGTH]
в отличии от кода
long long buffer[MAX_BUFFER_LENGTH]
будет занимать Овер дофига времени, что несколько неожиданно...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, sergii.p, Вы писали:
SP>да, конечно не рекомендуется. Но когда вы используете производный тип с дефолтным конструктором, вы ожидаете что он произведёт какие-то инициализирующие действия.
Я не ожидаю и считаю, что STL зря во многих других типах инициализирует данные в конструкторах по умолчанию.