我有一个以 int 作为参数的 some_func 函数调用。
int some_func(int);
class S {
public:
S(int v) {
a = v;
}
...
operator bool() const {
return true;
}
int a;
}; // class S doesn't define any "operator int"
S obj;
int x = some_func(obj); // some_func expected an int argument
在上面的代码中,some_func 需要一个 int 参数,但它是用一个 S 类型的对象调用的。所以它需要将它转换为“int”。
但为什么要使用“operator bool”呢?它不应该产生编译错误,说没有为类 S 指定正确的 int 转换方法吗?
如果我删除 operator bool 定义,则程序不会编译并给出有关 some_func 调用中参数类型不匹配的错误。
最佳答案
C++ 具有隐式转换。通过定义转换运算符 operator bool()
,您已使 S 可隐式转换为 bool。这是用户定义的转换。一次转换可以由一系列转换组成(其中只有一个可以由用户定义)。
虽然没有直接从 S 到 int 的转换,但是有一个从 bool 到 int 的内置转换(这是一个整数提升,true 转换为 1,false 转换为 0)。因此转换序列 S -> bool -> int 是有效的,因此 S 可以隐式转换为 int。
附言。如果您想在调用该函数时阻止从 bool 的隐式转换,您可以声明一个已删除的重载,重载决议将首选该重载:
int some_func(bool) = delete;
关于c++ - 如果类对象需要在 C++ 中转换为 int,为什么会调用 "operator bool()"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44741679/