E1776在分配时(过载)具有隐式强制转换访问

时间:2019-02-19 20:27:35

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

假设我有下面的代码,其中删除了复制分配运算符,并将一个int-assignment运算符与一个int-access运算符(未标记并带有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 :(得分:0)

实际上,还不清楚您为什么还要期待其他内容,因为这正是删除方法的工作方式。来自cppreference(强调我的):

  

如果特殊语法= delete,而不是函数主体;用来,   功能已定义为已删除。删除功能的使用   格式不正确(程序将无法编译)。

通过写作

OverloadTest operator=(const OverloadTest &) = delete;

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