приколы с операторами

poty

★★★★★★✩
19 Фев 2020
2,990
895
@SergejEU, я предлагаю перенести сравнение внутрь функции, аргументы которой соответствуют двум типам, о которых идёт спор, тогда Ваш пример будет репрезентативен. Сейчас же это демонстрация забавных исключений, которые к рассматриваемой задаче отношения не имеют.
 

Kir

★✩✩✩✩✩✩
28 Мар 2020
69
16
@SergejEU, чтобы оставаться в контексте темы, поступим так, вот заготовка из 2-х реализаций, в одной используется size_t, в другой ptrdiff_t.

C++:
#include <iostream>
#include <stddef.h>


template<typename T>
T& DefaultException() noexcept {
    static T err;
    std::cout << "out of range error" << std::endl;
    return err;
}



template<typename T, size_t N,
    T& (&ExceptionHandler)() noexcept = DefaultException<T>>
class testArraySize_t final {
public:
    typedef T      type;
    typedef type&  reference_type;
    typedef type*  pointer_type;
    typedef size_t size_type;
    typedef size_t index_type;

    reference_type operator[](index_type index) noexcept {
        return (index < size()) ? array[index] : ExceptionHandler();
    }

    size_type size() const { return N; }

    testArraySize_t() = default;
   ~testArraySize_t() = default;

    testArraySize_t(const testArraySize_t& rhs) = delete;
    testArraySize_t(testArraySize_t&& rhs)      = delete;

private:
    type array[N];
};



template<typename T, size_t N,
    T& (&ExceptionHandler)() noexcept = DefaultException<T>>
class testArrayPtrdiff_t final {
public:
    typedef T         type;
    typedef type&     reference_type;
    typedef type*     pointer_type;
    typedef size_t    size_type;
    typedef ptrdiff_t index_type;

    reference_type operator[](index_type index) noexcept {
        return ((index >= 0) && (index < size()))
            ? array[index] : ExceptionHandler();
    }

    size_type size() const { return N; }

    testArrayPtrdiff_t() = default;
   ~testArrayPtrdiff_t() = default;

    testArrayPtrdiff_t(const testArrayPtrdiff_t& rhs) = delete;
    testArrayPtrdiff_t(testArrayPtrdiff_t&& rhs)      = delete;

private:
    type array[N];
};



testArraySize_t<int, 100000>    test_s;
testArrayPtrdiff_t<int, 100000> test_p;



int main(void) {
    test_s[0] = 10;
    test_s[1] = 10;
    test_s[468] = 10;
    test_s[10000] = 10;

    test_p[0] = 10;
    test_p[1] = 10;
    test_p[468] = 10;
    test_p[10000] = 10;


    test_s[-1] = 0;
    test_p[-1] = 0;
}
Напишите тест, в котором эти 2 реализации будут по разному отрабатывать выход за границу массива, при обращении к объектам через operator[].
Запускать можете на любой платформе (МК/ПК).

Механизм исключений с++ не доступен, чтобы можно было запускать на МК, но можете определить свою функцию, и передать в качестве 3-го параметра шаблона для testArray-ев, или переписать функцию определенную по умолчанию. Функция должна возвращать ссылку на существующий объект того же типа, который определен первым параметром параметра шаблона для testArray.

Если сможете такой тест написать, и при этом, вариант с ptrdiff_t будет работать корректно, а вариант с size_t - нет, тогда вы будете абсолютно правы в данной ситуации, если же варианты будут вести себя по разному, но оба не корректно, ну ок, разница есть, а если разницы нет, то правда за мной.