C++ 为什么是;运算符bool();如果类对象需要在C+;中转换为int,则调用+;?
我有一个函数调用某个以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 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
您可以通过定义自己的显式运算符来防止这种隐式转换。请参阅,或者您可以声明删除重载
有关类似问题,请参阅。我想你会在你寻求的解决方案中学到一些东西。Abool
值可以隐式转换为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
,正如为这个用例所解释的[这里](