【发布时间】:2013-10-16 10:50:00
【问题描述】:
struct A
{
A();
A(const A&);
A& operator =(const A&);
A(A&&) = delete;
A& operator =(A&&) = delete;
};
struct B
{
B();
B(const B&);
B& operator =(const B&);
};
int main()
{
A a;
a = A(); // error C2280
B b;
b = B(); // OK
}
我的编译器是 VC++ 2013 RC。
错误 C2280: 'A &A::operator =(A &&)' : 试图引用 删除功能
我只是想知道为什么当A& operator =(A&&)被删除时编译器不尝试A& operator =(const A&);?
这种行为是否由 C++ 标准定义?
【问题讨论】:
-
你也可以复制错误信息,因为
C2280要求每个人都用谷歌搜索。 -
@Rapptz,然而,我明确定义了 copy-ctor 和 copy-assignment。
-
@WhozCraig:“查找和重载解析发生在删除的定义被记录之前。”。 1) 重载决议选择了移动赋值 2) 注意被删除 3) 编译失败
-
@mirk 所以它被声明为声明,但直到重载决议之后才真正被删除。这可以总结一下吗?因此它匹配,因此她打破了?好的。这很有意义。
标签: c++ c++11 overloading semantics language-lawyer