gpt4 book ai didi

c++ - 隐式转换为 bool 值并与 bool 文字进行比较

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:10:33 24 4
gpt4 key购买 nike

我在回答 this question ,关于用户定义的转换为 bool 以及如何禁用其他转换的主题:

struct foo
{
operator bool() const //Explicit overload for bool
{
return true;
}

template<typename T>
operator T() const = delete; //Everithing which is not a bool (Everithing which
//does not fit in the explicit overload) would
//resolve to this operator and will fail.
};


int main()
{
foo f;

bool b = f; //OK
int i = f; //ERROR
char c = f; //ERROR
etc...
}

后来 OP 问我为什么像 if( f == true ) 这样的条件语句失败了(其中 ffoo。我试过了这让我感到惊讶,因为与 bool 文字的比较导致转换为 int (已禁用)而不是 bool:

int main()
{
foo f;

if( f ); //OK, converts to bool
if( f == true ); //ERROR: Conversion to int, which has been disabled
}

prog.cpp:20:12: error: use of deleted function ‘foo::operator T() const [with T = int]’ if( f == true);
..............................................................................................................................................^

我的问题是: bool 文字是否被定义为整数(就像常见的 C 宏 #define true 1 #define false 0),如果不是,为什么比较会导致 int转换而不是 bool

我正在使用启用了 C++11 的 GCC4.8.1 (-std=C++11)。

Here ideone 就是这种行为的一个例子。

最佳答案

因为 foo 是一个类类型,所以在使用没有为该类类型专门定义的运算符时适用特殊规则,请参阅 [over.built]/12

For every pair of promoted arithmetic types L and R, there exist candidate operator functions of the form

LR operator*(L, R);
LR operator/(L, R);
LR operator+(L, R);
LR operator-(L, R);
bool operator<(L, R);
bool operator>(L, R);
bool operator<=(L, R);
bool operator>=(L, R);
bool operator==(L, R);
bool operator!=(L, R);

where LR is the result of the usual arithmetic conversions between types L and R.

不是术语提升的算术类型的用法:这需要提升bool

bool 被提升为 int,参见 [conv.prom]/6(积分提升)

A prvalue of type bool can be converted to a prvalue of type int, with false becoming zero and true becoming one.


所以有形式的候选函数

common_type<L,int> operator==(L, int);

其中 L 是提升的算术类型。然而,它们有很多,例如

common_type<int      , int> operator==(int      , int);
common_type<long , int> operator==(long , int);
common_type<long long, int> operator==(long long, int);

每个都需要用户定义的从 foo 到提升类型的转换。我不清楚为什么这不是模棱两可的,因为 foo 可以转换为它们中的任何一个。这也在 Unresolved 问题中描述 CWG 954 .

如果有几个非模板转换函数,g++4.8.1clang++3.5报告这种歧义。 (需要注意的是,clang 在这里可能有一个 bug,参见 this example,它在 g++4.8.1 下运行良好。)


但是,没有候选的形式

common_type<bool, int> operator==(bool, int);

因为 bool 不是提升的算术类型。因此,从 foobool 的转换将被选择用于表达式

foo x;
x == true

关于c++ - 隐式转换为 bool 值并与 bool 文字进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351450/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com