【问题标题】:Conditional operator successfully compiled in windows but gives error in Linux条件运算符在 Windows 中成功编译,但在 Linux 中出错
【发布时间】:2013-10-09 21:56:20
【问题描述】:

请帮我解释一下我在 Linux 环境中使用此语句时遇到的错误。

p_pAphErrorMessage->getSvc()?l_AphUpdateMessage->setSvc(p_pAphErrorMessage->getSvc()):0;
p_pAphErrorMessage->getObj()?l_AphUpdateMessage->setObj(p_pAphErrorMessage->getObj()):0;

这段代码在windows下编译成功,但在Linux环境下报错。

src/aph.cpp:7320: error: âl_AphUpdateMessage->AphMessage::setSvc(((AphUpdateMessage*)p_pAphErrorMessage)->AphUpdateMessage::<anonymous>.AphFidValuesMessage::<anonymous>.AphMessage::getSvc())â has type âvoidâ and is not a throw-expression
src/aph.cpp:7321: error: âl_AphUpdateMessage->AphMessage::setObj(((AphUpdateMessage*)p_pAphErrorMessage)->AphUpdateMessage::<anonymous>.AphFidValuesMessage::<anonymous>.AphMessage::getObj())â has type âvoidâ and is not a throw-expression

我对此进行了一些调查,并怀疑返回 0;可能是它的原因。 我们能否以这种方式使用条件运算符,只为 if 而不是 else,例如,

c= a?a:/*DO NOTHING*/;

但是,这样我在编译中没有任何成功。任何其他推荐的实现方式。

【问题讨论】:

  • 您为什么尝试使用三元运算符纯粹是为了产生副作用?为什么不直接使用if
  • 你使用什么编译器?这里很有可能不仅仅是“Windows”和“Linux”。
  • @svk 三元运算符不仅是为了副作用,而且他真的不想要它的第三部分。这是对三元运算符的滥用。正如你所说,只需使用if
  • @ ALL,这不应该有效并且可以接受吗?正如 Joachim 先生所建议的那样。

标签: c++ linux conditional-operator


【解决方案1】:

您必须将零转换为void,例如

condition ? expression : (void) 0;

原因是setSvcsetObj 都被声明为返回void(如错误消息中所示)。这意味着您调用它们的表达式的结果是什么。但另一个“假”表达式是一个有值的表达式。所以三元表达式有一个不返回值的分支和一个返回值的分支,这是不允许的。将“false”表达式转换为 void 会使两个分支相同。

【讨论】:

  • 能否请您解释一下原因?将来对我有帮助。
  • “这是不允许的”:除非void 是一个抛出表达式。
  • 既然我在这里得到了所有的答案,还有一个有待回答。这是什么意思“不是一个抛出表达式”?
【解决方案2】:

不,您不能以这种方式使用三元运算符,因为它使用 3 个参数进行操作:

expression1 : expression2 ? expression3

但你总是可以做到的:

c = a ? a : c;

【讨论】:

  • 这是一个好方法。但是如果 c 之前没有正确初始化,这不应该会导致不良行为吗?谢谢。
  • 没关系,如果c 没有初始化,那么什么都不会改变。但是,是的,一些调试器会警告你使用未初始化的变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-17
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多