问题: 隐式 bool 转换是否总是回退到尝试隐式转换为 void*
? (如果该类型存在这样的转换函数)。如果有,为什么?
考虑以下短程序:
#include <iostream>
class Foo{
public:
operator void*() const
{
std::cout << "operator void*() const" << std::endl;
return 0;
}
};
int main()
{
Foo f;
if(f)
std::cout << "True" << std::endl;
else
std::cout << "False" << std::endl;
return 0;
}
这个程序的输出是:
operator void*() const
False
意思是调用void*
的转换函数。
如果我们在转换函数前面标记 explicit
限定符,那么到 void*
的隐式转换将失败。
编辑:
似乎很多答案是“空指针可以转换为 false
”。我明白这一点,我的问题是关于“如果我不能直接调用 operator bool()
那么我将尝试转换为任何指针”。
最佳答案
如果编译器无法将用户定义的类型转换为 bool
直接,然后它尝试间接执行,即转换(通过用户定义的转换)到可以转换为 bool
的类型不涉及另一个用户定义的转换。此类类型的列表包括(并且似乎仅限于)以下类型:
- 整数算术类型(
char
、int
等) - 浮点算术类型(
float
、double
、long double
) - 指针类型(
void*
属于这里,但也可以是const std::vector<Something>*
) - 指向函数的指针(包括指向成员函数的指针)
- 上述任何一种的引用类型
但是请注意,这样的间接转换只能存在一种。如果上述列表中的两个或多个转换是可能的,那么编译器将面临歧义并报告错误。
关于C++,bool 转换是否总是退回到 void* 的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38535292/