c++ - E1776 在分配(重载)时具有隐式强制转换访问
问题描述
假设我有下面的代码,其中删除了复制赋值运算符,并将一个 int-assignment 运算符放置在一个 int-access 运算符(未标记explicit
关键字)旁边。b
to的分配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;
}
解决方案
实际上并不清楚为什么您期望其他东西,因为这就是删除方法应该如何工作。来自cppreference(强调我的):
如果,而不是函数体,特殊语法 = delete ; 被使用,函数定义为删除。对已删除函数的任何使用都是格式错误的(程序将无法编译)。
通过写作
OverloadTest operator=(const OverloadTest &) = delete;
您确实定义了运算符,但调用它会使您的代码格式错误。我发现很难回答更多,因为你的例子相当学术。a=b;
如果您根本不声明,您可以工作operator=(const OverloadTest&)
。但是,请注意,生成的编译器operator=
将用于评估a=b;
. 尽管由于您的班级只有int
成员,但您实际上无法区分调用该运算符或您的转换后跟operator=(int)
. 希望有帮助。
推荐阅读
- python - 尝试使用 python3 从 api 调用将数据输入数据库时的响应 [400]
- python - .loc 按日期过滤数据库
- c - 我正在制作代码树,数据结构。但是在打印过程中出现了错误
- node.js - 如何在 TypeScript 中扩展非导出类?
- angular - 如何引用 Leaflet.draw 中已删除的图层?
- javascript - 输入明文时出现错误“文本字符串必须在文本中呈现...”
- r - 如何在r中选择并重复数据框中的多行
- javascript - 当名称字段中存在任何重复值时,无法形成结构和更新标志值
- c++ - 这个函数是返回一个正确的 R 值引用还是返回一个副本?
- excel - How to fix this "ambiguous name detected Worksheet_Change"?