首页 > 解决方案 > E1776 在分配(重载)时具有隐式强制转换访问

问题描述

假设我有下面的代码,其中删除了复制赋值运算符,并将一个 int-assignment 运算符放置在一个 int-access 运算符(未标记explicit关键字)旁边。bto的分配a仅在显式转换int为如下时才有效,而 simple 会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;
    }

标签: c++visual-c++operator-overloading

解决方案


实际上并不清楚为什么您期望其他东西,因为这就是删除方法应该如何工作。来自cppreference(强调我的):

如果,而不是函数体,特殊语法 = delete ; 被使用,函数定义为删除。对已删除函数的任何使用都是格式错误的(程序将无法编译)。

通过写作

OverloadTest operator=(const OverloadTest &) = delete;

您确实定义了运算符,但调用它会使您的代码格式错误。我发现很难回答更多,因为你的例子相当学术。a=b;如果您根本不声明,您可以工作operator=(const OverloadTest&)。但是,请注意,生成的编译器operator=将用于评估a=b;. 尽管由于您的班级只有int成员,但您实际上无法区分调用该运算符或您的转换后跟operator=(int). 希望有帮助。


推荐阅读