为什么不能重载三元运算符?

新手上路,请多包涵

为什么不能重载三元运算符’?:’?

我经常使用三元运算符来合并 if 语句,并且很好奇为什么语言设计者选择禁止该运算符重载。我在 C++ 运算符重载 中寻找解释,但没有找到描述为什么这是不可能的解释。脚注提供的唯一信息是它不能被重载。

我最初的猜测是,重载运算符几乎总是会违反上面链接中给出的第一或第二个原则。重载的含义很少会很明显或清楚,或者会偏离其原始已知语义。

所以我的问题更多是为什么这是不可能的,而不是如何,因为我知道这是不可能的。

原文由 Paul Renton 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 639
2 个回答

我认为当时的主要原因是,为该运算符发明一种新语法似乎并不值得。没有标记 ?: ,因此您必须为此创建许多特殊的语法规则。 (当前的语法规则有 operator 后跟一个操作符,它是一个单一的记号。)

正如我们(从经验中)学到的更合理地使用运算符重载,很明显我们真的不应该允许重载 &&|| 或者,原因是其他响应已经指出,并且可能不是运算符逗号(因为重载版本不会具有用户期望的序列点)。所以支持它的动力比原来还要少。

原文由 James Kanze 发布,翻译遵循 CC BY-SA 3.0 许可协议

如果您可以覆盖三元运算符,则必须编写如下内容:

 xxx operator ?: ( bool condition, xxx trueVal, xxx falseVal );

要调用您的覆盖,编译器必须计算 trueValfalseVal 的值。这不是内置三元运算符的工作方式 - 它只计算其中一个值,这就是为什么您可以编写如下内容:

 return p == NULL ? 23 : p->value;

无需担心通过 NULL 指针进行间接寻址。

原文由 Marshall Clow 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题