[英]defining explicit overloaded constructor issue
我有以下课程,某些运算符已重载:
class CLASS1
{
CLASS1();
CLASS1(const CLASS1 &obj);
CLASS1 operator +(const CLASS1 &obj) {
CLASS1 srcObj;
// doing add stuff here
return srcObj;
}
void func()
{
CLASS1 boj = // some method which returns CLASS1 obj.
}
CLASS1& operator =(const CLASS1 &obj) {
// copy properties
}
}
好的,这很好。 但是过了一会儿,我决定让我的班级显式以避免隐式转换。 因此,我这样做是这样的:
class CLASS1
{
explicit CLASS1();
explicit CLASS1(const CLASS1 &obj);
CLASS1 operator +(const CLASS1 &obj) {
CLASS1 srcObj;
// doing add stuff here
return srcObj; // compiler gives non-matching errors
}
void func() {
CLASS1 boj = somemethods(); // compiler gives non-matching errors
}
CLASS1& operator =(const CLASS1 &obj) {
// copy properties
}
}
现在,尽管我显式重载了赋值运算符,但编译器给出了“没有匹配的函数来调用...”错误(在上面的代码中指定)。 我的错误在哪里?
当按值返回对象时,将隐式调用copy-constructor。 如果您说不允许隐式调用它,则会出现错误。
您不应该对explicit
,复制或移动构造函数使用explicit
。 或对于采用多个参数的构造函数。 仅适用于采用单个参数的构造函数(带有注明的异常)。
从技术上讲,从方法返回对象时,在方法调用外部收到的对象实际上是在方法内部声明的对象的副本。 因此,编译器必须具有一种允许的方法,以将方法内对象中的“内容”转移到方法结果中。 由于不再需要方法中的实例,因此移动是最好的方法(是的,您需要添加move构造函数):
CLASS1(CLASS1&& obj);
这将允许您禁止隐式转换,同时保持拥有临时对象的能力。
在现实生活中,上述复制/移动很可能会通过RVO / NRVO进行优化。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.