• Инвариант в линейном поиске?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    1. A[i] ∈ A
    2. i ∈ {0, ...A.length - 1} или i ∈ {}

    Как по мне, такой инвариант будет несколько бесполезен, поскольку не позволяет доказать правильность алгоритма (по индукции). Также "или i ∈ {}" ещё более бесполезное дополнение к условию, поскольку, хоть и не делает инвариант неверным, но делает его слабее, ведь внутри цикла (да и после него) в i всегда какое-то число.

    Имхо, хороший инвариант:
    В элементах A с индексами до [i-1] включительно не содержится v.
    Ответ написан
    Комментировать
  • Логический тип bool и оператор new. Что тут вообще происходит?

    @TheCalligrapher
    У вас в вопросе приведено new-expression, которое возвращает указатель типа bool *. Откуда вы вдруг взяли "указатель на void" - не ясно. New-expression никогда не возвращает "указатель на void".

    При этом любой указатель в языке С++ неявно приводим к типу bool. Именно это и используется в вашем примере.

    Дополнительно можно заметить, что начиная с С++20 преобразование указателей к типу bool является сужающим (narrowing). Это означает что оно, в частности, больше не будет выполняться неявно в контексте списковой инициализации

    bool value1{ new bool(true) }; // Ошибка

    Я, правда, не помню навскидку, было ли это изменение в итоге принято как дефект C++17 или как несовместимое изменение языка.
    Ответ написан
    21 комментарий