如何确定三元运算符的返回类型?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

我在棋盘上解决了关于主教的问题。在我的代码的某一点,我包括以下行:

std::cout << (abs(c2-c1) == abs(r2-r1)) ? 1 : 2 << std::endl;

这会生成以下错误:

error: invalid operands of types 'int' and '<unresolved overloaded function type>' to binary 'operator<<'

但是,我通过在我的代码中包含一个额外的变量来立即修复此错误:

int steps = (abs(c2-c1) == abs(r2-r1)) ? 1 : 2;
std::cout << steps << std::endl;

现在我在脑海中有这个问题,三元运算符是如何工作的以及它的返回类型是如何确定的(正如编译器所称<unresolved overloaded function type>)。

提问于
用户回答回答于

这与返回类型的推导和所有与运算符优先..当你有

std::cout << (abs(c2-c1) == abs(r2-r1)) ? 1 : 2 << std::endl;

不是

std::cout << ((abs(c2-c1) == abs(r2-r1)) ? 1 : 2) << std::endl;

因为?:优先级低于<<..这意味着你真正拥有的是

std::cout << (abs(c2-c1) == abs(r2-r1)) ? 1 : (2 << std::endl);

这就是为什么你会发现<unresolved overloaded function type>..只需使用括号,如

std::cout << ((abs(c2-c1) == abs(r2-r1)) ? 1 : 2) << std::endl;
用户回答回答于

您必须在三元操作周围放置括号:

std::cout << ((abs(c2-c1) == abs(r2-r1)) ? 1 : 2) << std::endl;

如果不是<<操作员转到2它会产生一个错误,因为它没有这样的重载函数。

这是因为按位左移运算符(<<)具有比三元运算符更高的优先级。您可以在C+引用的下一页中看到操作符的完整列表及其先例:https:/en.cpprience.com/w/cpp/language/Operator_优先

扫码关注云+社区

领取腾讯云代金券