我将以下类作为基本类型bool
的包装器:
class MyBoolean {
public:
MyBoolean(bool value = false):value(value) {};
virtual ~MyBoolean() {};
void MySpecialFunction();
...
private:
bool value;
}
我想在表达式中使用MyBoolean
作为普通bool
。也就是说,分配给它,比较等。为此,我定义了赋值和隐式类型转换运算符。
inline operator bool() const {
return value;
}
inline bool operator = (const bool &rhs) {
return value = rhs;
}
然而,似乎不需要赋值赋形符。以下代码仅使用类型转换运算符进行编译,而不使用赋值运算符:
MyBoolean b;
b = true;
为什么编译器没有抱怨它无法将bool
分配到MyBoolean
? C ++中不同类型的赋值运算符的默认实现是什么?
答案 0 :(得分:3)
构造函数MyBoolean(bool value = false)
是“converting constructor”,允许编译器使用这样的一个生成一个隐式转换(在本例中来自bool
到MyBoolean
)。
如果您不希望构造函数用于隐式转换,则将其声明为explicit
- 如
explicit MyBoolean(bool value = false)
答案 1 :(得分:2)
您不需要赋值运算符的原因是因为您有非显式converting constructor。当你这样做
b = true;
编译器发现它可以使用
将true
转换为MyBoolean
MyBoolean(bool value = false):value(value) {};
由于您获得了一个用户提供的转换,编译器构造一个临时MyBoolean
,然后使用默认的复制赋值运算符将其分配给b
。
答案 2 :(得分:0)
执行b = true
后,它会生成新的MyBoolean
。
MyBoolean b;
b = true;
评估到
MyBoolean b;
b = MyBoolean(true);