假设我有下面的代码,其中删除了复制分配运算符,并将一个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;
}
答案 0 :(得分:0)
实际上,还不清楚您为什么还要期待其他内容,因为这正是删除方法的工作方式。来自cppreference(强调我的):
如果特殊语法= delete,而不是函数主体;用来, 功能已定义为已删除。删除功能的使用 格式不正确(程序将无法编译)。
通过写作
OverloadTest operator=(const OverloadTest &) = delete;
您确实定义了运算符,但是调用该运算符会使您的代码格式错误。我发现很难回答更多的问题,因为您的例子相当学术。如果您根本不声明a=b;
,则可以使operator=(const OverloadTest&)
工作。但是,请注意,然后编译器生成的operator=
将用于评估a=b;
。尽管由于您的班级只有int
成员,所以您实际上无法分辨调用该运算符或转换后跟operator=(int)
之间的区别。希望能有所帮助。