объявление поля при вызове const: «на функцию operator = (const memAddress &) нельзя ссылаться - это удаленная функция» - PullRequest
0 голосов
/ 10 октября 2018

У меня есть структура для хранения и управления адресом памяти.Я решил изменить одно из полей с int на const int, чтобы гарантировать, что оно доступно только для чтения, и внезапно определенный оператор- () выдает следующее сообщение:

На функцию "memAddress :: operator = (const memAddress &)" (объявленную неявно) нельзя ссылаться - это удаленная функция

Вот код,

struct memAddress
{
    // memory location variables
    int die = 0;
    int plane = 0;
    int page = 0;
    int column = 0;
    int block = _BLOCK_STARTING_ADDRESS;

    memAddress() {}

    memAddress(const memAddress &m)
    {
        die = m.die;
        plane = m.plane;
        page = m.page;
        column = m.column;
        block = m.block;
    }

    bool operator<(const memAddress &m)
    {
        if (die > m.die)
            return false;
        else if (die == m.die)
        {
            if (plane > m.plane)
                return false;
            else if (plane == m.plane)
            {
                if (block > m.block)
                    return false;
                else if (block == m.block)
                {
                    if (page > m.page)
                        return false;
                    else if (page == m.page)
                    {
                        if (column >= m.column)
                            return false;
                        else
                            return true;
                    }
                    else
                        return true;
                }
                else
                    return true;
            }
            else
                return true;
        }
        else
            return true;

    }

    bool operator==(const memAddress &m)
    {
        if (die == m.die &&
            plane == m.plane &&
            block == m.block &&
            page == m.page &&
            column == m.column)
        {
            return true;
        }

        return false;
    }

    bool operator<=(const memAddress &m)
    {
        if ((*this < m) || (*this == m))
            return true;

        return false;
    }

    bool operator>(const memAddress &m)
    {
        if (!(*this <= m))
            return true;

        return false;
    }

    bool operator>=(const memAddress &m)
    {
        if ((*this > m) || (*this == m))
            return true;

        return false;
    }

    memAddress operator-(const memAddress &m)
    {
        memAddress diff, a1, a2;

        if (*this < m)
        {
            a2 = m; // **error** 
            a1 = *this; // **error**
        }
        else
        {
            a2 = *this; // **error**
            a1 = m; // **error**
        }

        diff.die = a2.die - a1.die;
        diff.plane = a2.plane - a1.plane;
        diff.block = a2.block - a1.block;
        diff.page = a2.page - a1.page;
        diff.column = a2.column - a1.column;

        return diff;

    }

private:
    const int _BLOCK_STARTING_ADDRESS = 2; // **modifier added here**

};

IЯ не знаю, почему это происходит - код работает нормально, если модификатор удален.

Почему изменение модификатора поля на const привело бы к такому поведению?Как я могу обойти это?

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Поскольку у вас есть нестатический элемент данных const не-класс (const int _BLOCK_STARTING_ADDRESS), оператор присваивания по умолчанию удален.

Созданиеэлемент static будет генерировать оператор присваивания по умолчанию.

В проекте CPP (N4713) говорится об операторе назначения:

15.8.2 Оператор назначения копирования / перемещения
...
7. Оператор присваивания по умолчанию для копирования / перемещения для класса X определяется как удаленный, если X имеет :
(7.1) - вариантный член с нетривиальным соответствующим оператором присваивания и X является объединениемнапример, class, или
(7.2) - нестатический член данных типа const non-class (или его массив), или
(7.3) - нестатический член данныхссылочный тип или
(7.4) - прямой нестатический член данных типа класса M (или его массив) или прямой базовый класс M, который нельзя скопировать / переместить из-за разрешения перегрузки (16.3), применяемого для поискаСоответствующий оператор присваивания M приводит к неоднозначности или функции, которая удаляется или недоступна из оператора присваивания по умолчанию.

0 голосов
/ 10 октября 2018

Использование всех заглавных букв (а также использование его для инициализации block) указывает на то, что вы намерены _BLOCK_STARTING_ADDRESS быть константой класса для всех экземпляров.

Так что, прежде всего, сделайте это статическим

static const int _BLOCK_STARTING_ADDRESS = 2;

Почему?Потому что в противном случае это элемент данных каждого экземпляра.Это означает, что у каждого экземпляра есть небольшой кусочек, который должен быть const, и вы не можете назначить по умолчанию этот константный бит.По этой причине компилятор не может сгенерировать для вас оператор присваивания по умолчанию.

Кроме того, в качестве стороны нет.Имена, начинающиеся с _[A-Z], зарезервированы для реализации C ++ для любого использования.Чтобы избежать возможности назальных демонов, я предлагаю вам изменить схему именования для него.Возможно даже тому, кто меньше кричит ?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...