Pull to refresh
2
0
Send message
На данный момент это уже можно считать мифом.
Придраться можно ко многому, но точно не к тому, что
if (result != -13)

process(result, true, false, true);

cb(data.second.first, data.second.second);

более читаемо, чем
if (new_descriptor == kBadDescriptor)

Process(Options::kSync, new_descriptor);

on_data(data.descriptor, data.payload);
Невойд функция без return вообще не должна компилироваться, это явно некорректная программа

Такие простые случаи действительно могут детектиться и вызывать ошибку компиляции. Но в общем случае задетектить выход из функции без return-а невозможно.
Правило пяти это достаточно редкая штука. Сейчас в мете «правило ноля». И для него вообще ничего делать не надо — в этом и простота.
А через дебри лезть не надо. Достаточно современного подмножества (да и то не все фичи оттуда нужно знать новичку).
Ждём ещё 20 лет
Можно просто
if (m.count(key))
Так ещё меньше различий. Думаю поэтому и не спешили добавлять contains в стандарт.
простую функцию для преобразования строки из utf8 в cp1251 и подобные
В текущем стандарте такого нет, но в будущем добавят (через 3-6 лет)
На самом деле на опустошённом объекте можно использовать любую функцию или метод, у которой нет в контракте предусловий на состояние этого объекта. Тогда поведение будет defined.
Пример такой функции: std::vector::clear. Любое состояние объекта переводит в состояние «пустой вектор», работа с которым дальше определена. И таких функций на самом деле полно.
Интересно, зачем ещё делать static переменную внутри метода? В чём оказия?
А что не так? Никто не обещал, что сложение указателя это какая то тривиальная операция, которая всегда определена. Тоже самое можно сказать про сложение знаковых чисел. При переполнении имеем UB.
Пройтись по всем cpp и пофиксить ошибки сборки (при том скорее всего большая часть инклудов придёт из парного хэдера, что сократит объём работы). Думаю, за день можно справиться, максимум за три. Сложностей пока не вижу, только время.
Если так делали специально, то это неправильное использование PCH. PCH не отменяет «самодостаточность» хедеров, просто за ней становится чуть сложнее следить.
К сожалению, stackfull из буста это дикий набор низкоуровневых хаков, которые, видимо, не все компиляторы даже адекватно обрабатывают.

Например, пытался юзать в msvc — ловил прикольные эффекты с goto в catch блок без исключения.
Или цикл while (true) с вызовами async_write/async_read (из буста) выходил после первой итерации — помогала запись bool dummy = true;
while (dummy).

Вобщем, все надежды на с++20, верим и ждём. Пока писать асинхронный код действительно тяжело (или по крайней мере неудобно) по сравнению с другими языками.
Надо просто читать не по слогам и даже не по словам, а целыми блоками — скорость чтения возрастает. А если делать переносы строк на скобках, то придется мотать экран туда-сюда
Этого всегда будет недостаточно. Такие проверки в принципе неразрешимы, придётся банить потенциально корректный код (подход Раста как раз). А те, что разрешимы требуют много ресурсов, что делает их нерентабельными (замедлять компиляцию 99.999% корректного кода ради того чтоб найти ошибку в 0.001% мало кто хочет).
Указатели на функцию это один из кейсов. Как насчёт статических переменных? В каждой отдельной инстанции у нас создаётся своя переменная. Это поведение отличается от дженериков из с#, например. Такие эффекты недопустимо делать неявно.
Всё просто. Шаблоны имеют свои особые эффекты:
1) Увеличение ресурсов компиляции
2) Каждая новая инстанция шаблона это отдельная полноценная сущность (функция или класс). Это приводит например к тому, что адреса двух инстанций одной шаблонной функции неравны.
3) Следствие из п.2: раздувание бинарника.

Если вы уберёте все эти эффекты в неявный синтаксис, то огребёте потом отлаживать код (особенно п.2).
Да, если тип будет auto
Не согласен, вижу тут аналогию с деструкторами и RAII. Вызывая деструктор, вы точно так же говорите объекту освободить ресурсы, но нет гарантий, что объект спроектирован корректно и эти ресурсы освободит. Тем не менее, претензий к этому не возникает, потому что есть RAII — идиома, позволяющая создать такую гарантию. Если класс спроектирован корректно (RAII), то есть гарантия освобождения ресурсов.

То же самое с потоками. Чтобы мочь останавливать поток, сам поток (его функция) должны быть спроектированы так, чтобы поддерживать остановку. Тогда можно создать гарантию освобождения ресурсов. И не важно, принудительно мы что то завершаем или просим поток. Объект вы тоже принудительно не отчистите.

Насчёт того, что таких средств нет…
На самом деле в с++20 для этого даже есть стандартный класс потоков — std::jthread, но впрочем не сложно и свой навелосипедить.

Information

Rating
Does not participate
Registered
Activity