C++转换运算符过载
C++ conversion operator overload
‘int’和‘double’转换函数是‘explicit’的,在这段代码中,为什么我允许使用这种转换而不是错误消息?如果我删除我所有的转换过载功能代码发生"转换错误"
class Person
{
public:
Person(string s = "", int age = 0) :Name(s), Age(age) {}
operator string() const { return Name; }
explicit operator int() const{ return 10; } // ! Explicit
explicit operator double()const { return 20; } //! Explicit
operator bool()const { if (Name != "") return true; return false; } // using this
};
int main(){
Person a;
int z = a;
std::cout << z << std::endl; // Why print "1"? Why uses bool conversion?
}
我认为这是答案:
因为"a"不能转换为int或double,所以会出现错误,但因为它有bool转换函数,可以转换为int和int到double,代码使用此函数。
int z = a;
看起来无害,对吧?
上一行调用了隐式bool转换运算符,因为这是从Person
到int
的唯一方法,并且只需要一个用户定义的转换(允许的最大值)。
这就是C++11之前使用安全布尔习惯用法的原因,也是将转换运算符和单参数因子标记为explicit
的一般建议的主要原因,除非它们既不具有转换性也不具有损耗性。
如果您想亲自查看,请修复代码并跟踪operator bool
的调用。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 尝试使用算术运算符阻止隐式转换
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 是否可以将带有字符串化运算符的宏转换为 constexpr?
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 继承模板化转换运算符
- 将 OR 逻辑运算符从 C++ 转换为 Fortran
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在C++中正确重载运算符转换字符*?
- 将私有结构哈希器运算符转换为静态
- 混合类型的Boost运算符-转换和私有成员
- 如何将 c++ 运算符转换为 Java
- 运算符转换,GCC 和 clang:哪个编译器是正确的
- 将 istream 运算符>>转换为 istream getline
- 在C++中,将任意在位运算符转换为一元运算符
- 将运算符转换为 std::复杂<double>
- 为什么按位否定运算符"~"转换为 int?(从"int"转换为"无符号字符"可能会改变其值)