我为正常和临时对象重载了=运算符两次。 不幸的是,g ++(Debian 4.7.2-5)4.7.2允许过多的临时对象。 例如,他不应该允许分配临时对象。 他还允许将其他类型变量分配给对象。
#include <cstdlib>
#include <utility>
#include <iostream>
using namespace std;
class Simple {
int number;
public:
int getNumber() const {
return number;
}
Simple(const Simple& that) : number(that.number) {}
Simple(Simple&& that) : number(move(that.getNumber())) {}
Simple(int a) {number = a;}
Simple& operator=(const Simple &base) {
if (&base != this) {
this->number = std::move(base.getNumber());
}
return *this;
}
Simple& operator=(Simple&& base) {
if (&base != this) {
this->number = std::move(base.getNumber());
}
return *this;
}
};
Simple reverse(const Simple& base) {
Simple result(base.getNumber());
return result;
}
int main(int argc, char** argv) {
Simple one(4);
Simple two(5);
one = two.getNumber();//This should be compile error.
reverse(two) = one;This should be compile error.
return 0;
}
如何更改此代码以禁止分配给临时对象 和其他类型的隐式转换?
其他信息: 如何使该指令可实现:
Simple& operator=(Simple const &) && = delete;
我试图添加&amp;&amp; =在我的运算符声明结束时删除但编译器引发了编译错误。我试图在类范围之外实现此运算符但没有效果。
答案 0 :(得分:3)
第一个问题是你是否真的想要维护代码来抑制这些情况。通常,对于类类型,允许赋值到临时(rvalue),因为它调用任何其他成员函数。在C ++ 11及之后的rvalue-references中,您可以在重载决策期间区分rvalues和lvalues,并且可以用来阻止赋值给rvalue。要阻止来自int
的分配,您可以禁止所有隐式转换(我建议不要进行隐式转换)或阻止特定赋值运算符:
class Simple {
// ...
// Disallow implicit conversions from int
explicit Simple(int);
// Inhibit assignment to rvalues
Simple& operator=(Simple const &) && = delete;
// Alternatively, require that it is called on an lvalue
Simple& operator=(Simple const &s) &;
Simple& operator=(Simple &&) &;
// ... or block assigment from 'int'
Simple& operator=(int) = delete;
};
虽然说实话,我只会禁止隐式转换,并将其余部分留给班级用户。