C++ 在C+中使用多个三元运算符调用时,不会区分由bool和enum类型重载的函数+;

C++ 在C+中使用多个三元运算符调用时,不会区分由bool和enum类型重载的函数+;,c++,ternary-operator,overloading,C++,Ternary Operator,Overloading,尝试使用条件运算符调用重载函数时遇到了一个有趣的问题(只是为了避免多个if-else条件) 令人惊讶的是,如果我不使用三元运算符,而是使用多个if-else-if-else块,重载函数工作得很好。我很想了解原因。这是因为三元运算符总是计算为单一类型。不能使用此运算符“返回”不同的类型 当编译器遇到这样一个表达式时,他会试图弄清楚是否可以将整个过程简化为一种类型。如果这是不可能的,你会得到一个编译错误 在您的情况下,有一个有效的选项使用bool作为类型。因为cfg->dic是一种enum类型,可以

尝试使用条件运算符调用重载函数时遇到了一个有趣的问题(只是为了避免多个if-else条件)


令人惊讶的是,如果我不使用三元运算符,而是使用多个if-else-if-else块,重载函数工作得很好。我很想了解原因。

这是因为三元运算符总是计算为单一类型。不能使用此运算符“返回”不同的类型

当编译器遇到这样一个表达式时,他会试图弄清楚是否可以将整个过程简化为一种类型。如果这是不可能的,你会得到一个编译错误

在您的情况下,有一个有效的选项使用
bool
作为类型。因为
cfg->dic
是一种
enum
类型,可以隐式转换为
bool
。如果您使用and
enum类
,您的代码将不再编译,从而显示您的实际问题()

我也不知道这种代码的优点是什么。在我看来,这使得代码更难阅读。如果您担心的问题太多,您可以将
ifs
减少为一个:

if(acc == VirtualGpio::Pin)
  setCfgSetting(&cfg->pin,cfg->dic);
else
  setCfgSetting(&cfg->pin, cfg->dic == VirtualGpio::INPUT);

我们可以忍受糟糕的英语(毕竟我的法语很糟糕),但是你对格式的不重视是应该受到谴责的。谢谢,塞巴斯蒂安,也许我需要更多的理解,表达式,setCfgSetting(&cfg->pin,((acc==VirtualGpio::pin)?cfg->dic:((cfg->dic==VirtualGpio::INPUT)?true:false)))==错误)最终结果为“1”或“0”,尽管cfg->dic=“0xC7”的值为,您是说在类型转换后,枚举值0xC7将作为布尔值结束为“1”或“0”吗"?. 此外,我假设整个表达式仅对第一个三元运算符的右侧求值,即使我强制使第一个条件运算符的左侧为true
main()
{

  static struct VirtualGpio::pinconfig cfg = {

    .pin = {
      .location = VirtualGpio::GPIO_ON_GPIOEXP1_TCI,
      .pinno = 0,
      .portno = -1
    },
    .plrty = VirtualGpio::active_high,
    .IsPullupCfgValid = true,
    .IsTriStCfgValid = true,
    .IsInputFilterValid = true,
    .dic = VirtualGpio::OUTPUT,
    .fptr = NULL
  };

  factory fac;

  fac.GetGpiofactory(&cfg);

}
if(acc == VirtualGpio::Pin)
  setCfgSetting(&cfg->pin,cfg->dic);
else
  setCfgSetting(&cfg->pin, cfg->dic == VirtualGpio::INPUT);