C++,bool 转换是否总是退回到 void* 的隐式转换?

标签 c++ implicit-conversion void-pointers

问题: 隐式 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 的类型不涉及另一个用户定义的转换。此类类型的列表包括(并且似乎仅限于)以下类型:

  • 整数算术类型(charint 等)
  • 浮点算术类型(floatdoublelong double)
  • 指针类型(void* 属于这里,但也可以是 const std::vector<Something>*)
  • 指向函数的指针(包括指向成员函数的指针)
  • 上述任何一种的引用类型

但是请注意,这样的间接转换只能存在一种。如果上述列表中的两个或多个转换是可能的,那么编译器将面临歧义并报告错误。

关于C++,bool 转换是否总是退回到 void* 的隐式转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38535292/

相关文章:

c++ - 运算符重载(混淆为什么调用这个运算符)C++

c++ - visual c++ 2010 C++ 构建问题

c++ - 取回原始类型的 boost 变体变量

c++ - 友元函数返回 (void*) : cannot get implementation in . cpp 文件工作

c - 访问传递给 void* 指针的结构元素

c++ - 上限/下限不按我的预期工作,不明白为什么

scala - 在解释器中蒸发 Predef.any2stringadd

c++11 - 通过具有重载隐式转换的空结构成员计算 C++ 类中的成员

c++ - 为什么会有函数隐式转换为 boolean 值?

c++ - 将 void* 转换为仅在运行时已知的几种类型