C++ 为什么是;运算符bool();如果类对象需要在C+;中转换为int,则调用+;?

C++ 为什么是;运算符bool();如果类对象需要在C+;中转换为int,则调用+;?,c++,casting,operator-overloading,operators,implicit-conversion,C++,Casting,Operator Overloading,Operators,Implicit Conversion,我有一个函数调用某个以int为参数的函数 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为参数的函数

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
在上面的代码中,某些函数需要int参数,但被类型为S的对象调用。因此需要将其转换为“int”

但为什么要用“操作符bool”?它不应该产生编译错误,说没有为类S指定正确的int转换方法吗


如果删除运算符布尔定义,则程序不会编译,并在某些函数调用中给出参数类型不匹配的错误。

A
boolean
在内部表示为整数

true
被定义为
1
(基本上除了
0
)和
false
被定义为
0

所以可以这样做:


if(true+false+true)
将导致
if(2)
true
,因为只有
if(0)
false

C++具有隐式转换。通过定义转换运算符
operator bool()
,可以使S隐式转换为bool。这是用户定义的转换。转换可以由一系列转换组成(其中只有一个可以由用户定义)

虽然没有从S到int的直接转换,但是有一个从bool到int的内置转换(这是一个整数提升,true转换为1,false转换为0)。因此,转换序列S->bool->int是有效的,因此S可以隐式转换为int


另外,如果您想在调用该函数时阻止来自bool的隐式转换,可以声明一个重载解析首选的已删除重载:

int some_func(bool) = delete;

每当编译器可能需要将表达式转换为其他类型时,特别是对于函数调用的每个参数,它都会尝试:

  • 可选的标准转换序列
  • 可选的用户定义转换
  • 可选的标准转换序列
  • 标准转换序列是由语言定义的,如算术到算术转换、指针转换等。用户定义的转换是一种涉及构造函数的转换序列,该构造函数可以接受一个参数或转换函数,如
    S::operator bool()

    因此,在您的示例中,它成功地找到了无标准转换,然后是
    S::operator bool()
    用户定义的转换,然后是从
    bool
    int
    的标准转换


    有关详细信息,请参见。

    Bool
    Int
    都是
    数据类型。可以隐式或显式转换数据类型。隐式转换对用户不可见

    定义时:

    operator bool() const {
       return true;
     }
    
    然后
    S
    被隐式转换为
    bool
    。您可以显式地将其转换为
    int
    。但是请注意,当显式转换时,请记住
    字节的范围,不要将较大的数据类型转换为较小的数据类型,否则会丢失数据,因为某些字节(较大的数据类型-较小的数据类型)会被截断

    在您的问题中,
    整数
    被转换为
    布尔值
    (隐式转换)这里,除
    0
    以外的数字将存储为
    true
    ,其数字形式为
    1
    ,数字
    0
    本身将被处理为
    false
    ,因此将存储为
    0

    您可以通过定义自己的显式运算符来防止这种隐式转换。请参阅,或者您可以声明删除重载


    有关类似问题,请参阅。我想你会在你寻求的解决方案中学到一些东西。

    A
    bool
    值可以隐式转换为
    int
    ,值为
    0
    (对于
    false
    )或
    1
    (对于
    true
    )。有关更多信息,请参见例如(特别是关于)一节。我想我知道bool到int的升级和隐式转换背后的一般思想。但这是更微妙的:存在从“S”到int的隐式转换(步骤1),但隐式转换运算符不可用(showsupper问题)。因此使用了另一个操作符(操作符bool()),因为“bool”可以提升为int(步骤2)。STEP -1不能因为StestCuffor问题而发生……(继续…)(我继续)我认为C++没有指定操作员布尔的提升,而不是BooL(即当隐式转换运算符可以用它来转换S)-BoOL> int工作时。积分提升在哪里完全涵盖了它?为了防止隐式转换,使用-C++11.0以来提供的-To-nitpick:true可以用0以外的任何其他值表示。但是当BoL被转换成整数类型时,任何真值的表示都将被转换为1。(我在前面的注释中这样说:)我认为C++没有指定操作符BoL的替代,而不是BooL(即当隐式转换运算符可以用某种方式来转换S)-BoOL> int工作时。积分提升本身在哪里完全涵盖了它?或者
    显式运算符bool()const
    ,正如为这个用例所解释的[这里](