C++不同类型的默认赋值运算符
C++ default assignment operator from different type
我有以下类作为基本类型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)
是一个"转换构造函数",并且允许编译器使用这样的构造函数来生成一个隐式转换(在本例中为从bool
到MyBoolean
(。
如果不希望构造函数用于隐式转换,请将其声明为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);
这称为隐式类型转换
相关文章:
- 默认赋值运算符如何在实际 STL 中实现
- 如果类在 C++ 中具有常量或引用类型的非静态数据成员,为什么编译器不提供默认赋值运算符?
- C++不同类型的默认赋值运算符
- 将默认赋值运算符声明为 constexpr:哪个编译器是正确的?
- 默认赋值运算符有权访问基类的私有成员
- 错误:非静态引用成员"std::ostream&Student::out",无法使用默认赋值运算符
- 默认的复制构造函数和复制赋值运算符给出奇怪的错误
- 在这种情况下,我们需要禁用默认的复制构造函数和赋值运算符
- 错误:非静态引用成员,无法使用默认赋值运算符
- 如果成员具有非平凡的noexcept赋值运算符,则默认的移动赋值不能显式为noexcept
- 外部C结构的C++默认复制/移动赋值运算符不是常量
- 如果类具有引用数据成员,为什么编译器不合成默认赋值运算符
- 模板赋值运算符不替换默认赋值运算符
- 删除默认C++复制和移动构造函数和赋值运算符的缺点
- 具有不同模板参数的模板类的默认赋值运算符
- 重载赋值运算符或使用默认运算符
- 为什么我不能在 C++ 中使用模板版本覆盖默认的复制构造函数和赋值运算符
- c++默认的复制和赋值运算符
- 当类成员是引用时,是否无法生成默认赋值运算符?(在C++中)
- "非静态引用成员,不能使用默认赋值运算符"