C++不同类型的默认赋值运算符

C++ default assignment operator from different type

本文关键字:默认 赋值运算符 同类型 C++      更新时间:2023-10-16

我有以下类作为基本类型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++中不同类型的赋值运算符的默认实现是什么?

您的构造函数MyBoolean(bool value = false)是一个"转换构造函数",并且允许编译器使用这样的构造函数来生成一个隐式转换(在本例中为从boolMyBoolean(。

如果不希望构造函数用于隐式转换,请将其声明为explicit- 如

explicit MyBoolean(bool value = false)

不需要赋值运算符的原因是因为您有一个非显式转换构造函数。 当你这样做时

b = true;

编译器看到它可以使用以下方法将true转换为MyBoolean

MyBoolean(bool value = false):value(value) {};

由于您获得一个用户提供的转换,编译器会构造一个临时MyBoolean,然后使用默认的复制分配运算符将其分配给b

当你这样做b = true它会创建一个新的MyBoolean

MyBoolean b;
b = true;

计算结果为

MyBoolean b;
b = MyBoolean(true);

这称为隐式类型转换