Даже сейчас вы не можете завершить поток при этом быть уверенным что освободили все ресурсы и остановили все потоки который тот успел породить.
Я всё могу:
my_thread.cancel(); // сообщаем потоку что ему пора остановиться.
my_thread.join(); // дожидаемся пока поток остановится
// В этой точке есть гарантия, что все ресурсы освобождены и дочерние потоки остановлены.
К сожалению (или к счастью) параметры consteval функции не являются constant expression. Вот такой вот парадокс. Так что передавать constexpr значения в функцию можно пока только через шаблонные параметры, либо передавать в функцию объекты заглушки, а сами значения получать через decltype(paramN)::value.
Почему в принципе есть возможность успешно скомпилировать программу обращающуюся к неинициализированной переменной на чтение хоть с какими-то настройками компилятора?
Потому что в общем случае это невозможно диагностировать.
Пример:
int i;
if (some_runtime_dependent_condition()) {
cin >> i;
}
if (another_runtime_dependent_condition()) {
cout << i;
}
Мы административно гарантируем, что
another_runtime_dependent_condition()
равна true только когда
some_runtime_dependent_condition()
тоже равна true (это гарантируется, скажем, архитектурой).
Так что все эти «простые» UB на деле не диагностируемые. А в тех частных случаях, когда UB очевидно, компиляторы действительно пытаются сообщить юзеру. По крайней мере msvc с дефолтными настройками отказывается компилировать, если видит очевидное чтение неинициализированной переменной или выход из функции без return.
В ТГ чате упоминалось, что США выдвинуло замечание на фикс ключевых слов в корутинах (предложение Антона, которое не прошло ранее). Я так понимаю, успехов они не добились?
Такие параметры конструктора приводят к комбинаторному взрыву перегрузок. Самый православный вариант — шаблонный конструктор с forward reference, там тоже нет лишнего мува, но и конструктор всего один.
Вы путаете undefined behaviour и unspecified. Последнее как раз должно быть определено компилятором (но не обязательно документировано). А при undefined никто ничего никому не должен. Программа, его содержащая более не считается программой на языке С++. Что и используют разработчики компиляторов для проведения жёстких оптимизаций.
В этом и заключается вся прелесть С++. Он позволяет выражать в коде огромное количество разнообразных моделей. То, что реализация при этом сложно-читаема для неподготовленного зрителя — некритичный недостаток. Да и приведённая здесь шаблонная магия не такая уж и чёрная, есть и покруче приёмы :)
Тем не менее, вероятность конкретных последствий на распространенных платформах с распространенными компиляторами выше остальных. О вероятности уже рассуждать можно.
У нас есть предположение, что на первом мудреце не белый колпак (мы должны это опровергнуть). Оба других мудреца видят, что у первого не белый колпак. В то же время, они оба знают, что белый колпак обязательно существует на одном из них. Другими словами, если предложение верно, то можно вычеркнуть первого мудреца из системы, так как его наличие не влияет на результат.
Если перед вами 100 мудрецов с небелыми колпаками и один с белым, и вы видите, что мудрец с белым колпаком не догадывается что он с белым, то вывод очевиден — вы с белым колпаком тоже.
auto в C++ намного мощнее, чем в Java и C#. Оно там используется не только для вывода типа локальной переменной, но и для вывода возвращаемого значения из функции, вывода типов аргументов для лямбд.
1) sizeof(T) возвращает размер типа T в байтах.
2) sizeof(char) == 1 всегда, следовательно char и есть байт по размеру.
3) Платформозависимым является не размер типа char, а количество бит в одном байте (а значит и в одном char-е). За это отвечает константа CHAR_BIT.
Я всё могу:
Фрагментация жёсткого диска
Ага, после того как выпил из чашки чай (переместил чай из чашки в желудок), её следует уничтожить.
Потому что в общем случае это невозможно диагностировать.
Пример:
Мы административно гарантируем, что равна true только когда тоже равна true (это гарантируется, скажем, архитектурой).
Так что все эти «простые» UB на деле не диагностируемые. А в тех частных случаях, когда UB очевидно, компиляторы действительно пытаются сообщить юзеру. По крайней мере msvc с дефолтными настройками отказывается компилировать, если видит очевидное чтение неинициализированной переменной или выход из функции без return.
«Ну, судя по его поисковым запросам, он гей»?
Если перед вами 100 мудрецов с небелыми колпаками и один с белым, и вы видите, что мудрец с белым колпаком не догадывается что он с белым, то вывод очевиден — вы с белым колпаком тоже.
1) sizeof(T) возвращает размер типа T в байтах.
2) sizeof(char) == 1 всегда, следовательно char и есть байт по размеру.
3) Платформозависимым является не размер типа char, а количество бит в одном байте (а значит и в одном char-е). За это отвечает константа CHAR_BIT.
Источник: документация по C++
В production будет 2 строчки и Вы автоматически получите (например) возможность сериализации любого POD типа.
Беспокоиться о читаемости в данном случае не Ваша забота, а забота автора библиотеки, не Вы же ее поддерживаете.