E1776 при назначении (перегружен) с неявным доступом приведения - PullRequest
0 голосов
/ 19 февраля 2019

Предположим, у меня есть приведенный ниже код, в котором удален оператор присваивания копии и вместо него введен оператор int-присваивания ( не помечен с ключевым словом explicit).Присвоение b a работает только при явном приведении к int, как показано ниже, тогда как простое a = b; генерирует ошибку компиляции E1776 function "OverloadTest::operator=(const OverloadTest &)" cannot be referenced -- it is a deleted function.Есть ли какое-либо объяснение этому поведению, которое должно использовать преимущества явного удаления и реализации неявных операторов?Использование MSVC ++ 14.15.

    class OverloadTest
    {
        int i;

    public:
        OverloadTest(int i) : i(i)
        {
        }

        OverloadTest operator=(const OverloadTest &) = delete;

        int operator=(const int &other)
        {
            i = other;

            return i;
        }

        operator int()
        {
            return i;
        }
    };

    int main()
    {
        OverloadTest a(1), b(2);

        a = b; // E1776
        a = (int)b; // OK

        int (OverloadTest::* e)(const int &) = &OverloadTest::operator=;

        (a.*(&OverloadTest::operator=))(b); // E0299
        (a.*e)(b); // OK

        return 0;
    }

1 Ответ

0 голосов
/ 20 февраля 2019

На самом деле не совсем понятно, почему вы ожидали чего-то другого, поскольку именно так должно работать удаление метода.From cppreference (выделите мое):

Если вместо тела функции используется специальный синтаксис = delete;используется, функция определяется как как удаленная.Любое использование удаленной функции некорректно (программа не будет компилироваться).

Написав

OverloadTest operator=(const OverloadTest &) = delete;

, вы определите оператор, но вызов его вызоветКод неверно сформирован.Я затрудняюсь ответить больше, потому что ваш пример довольно академический.Вы можете заставить a=b; работать, если вы просто не объявляете operator=(const OverloadTest&).Однако обратите внимание, что тогда сгенерированный operator= компилятор будет использоваться для оценки a=b;.Хотя в вашем классе только член int, вы на самом деле не можете определить разницу между вызовом этого оператора или вашим преобразованием, за которым следует operator=(int).Надеюсь, это поможет.

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