为什么一切都不能在C ++中重载?

时间:2011-03-15 17:55:35

标签: c++ operator-overloading

sizeoftypeid无法重载是合理的,但我无法看到重载?:.*.的危害。这有技术原因吗?

6 个答案:

答案 0 :(得分:16)

引用Bjarne Stroustrup:

  

没有根本原因   不允许超载?:。我只是   没看到有必要介绍一下   超载三元的特例   运营商。注意一个功能   重载expr1?expr2:expr3会   不能保证只有一个   执行了expr2和expr3。

...

  

运营商。 (点)原则上可以   使用相同的技术重载   用于 - >。但是,这样做可以   引出有关是否的问题   操作是针对该对象的   重载.或引用的对象   通过. ...这个问题可以解决   几种方式。在那个时间   标准化,并不明显   哪种方式最好。

Source

答案 1 :(得分:7)

如果你重载.,你会如何访问班级成员? obj.data的含义是什么?

答案 2 :(得分:3)

语法是什么?

事实上,有充分的理由不重载任何运营商 它没有评估它的所有操作数:你不应该 过载&&或|| (特殊情况除外)。你不能 用重载运算符模拟这个。考虑一下 喜欢:     p!= NULL? defaultValue:p-> getValue() 其中defaultValue或p-> getValue()的类型导致重载 解决你的超载问题。这是一个常见的习语,但是 如果超载,它就无法工作?:。

答案 3 :(得分:0)

以下是一些阅读材料C++ FAQ Lite:)

一般来说,重载上面的运算符没有任何好处。你想要实现哪些额外的语义?

重载运算符的原因是为类的用户提供直观的语法。例如,对字符串重载+和+ =是有意义的。对于另一位开发人员来说,这意味着什么。

你真的不明白你会超载的是什么?:for ...那就是说我没有任何技术原因可以防止这些操作员过载。

重载 - >运算符允许创建引用计数指针,例如boost :: shared_ptr。 “否定”一个对象的概念在不同的上下文中可能有不同的含义,因此偶尔重载该运算符是合理的。

答案 4 :(得分:0)

定义“operator bool”就足够了?:工作。 对于运营商。想到这个:SomeClass。“SomeString !!”

这些重载禁止编译器的词法分析器正确解析文件。

答案 5 :(得分:0)

您可以重载大多数操作符的原因是能够模拟内置类型。由于没有任何内置类型可以使用.运算符,因此它不会用于任何目的。 operator*operator->就在那里,所以你可以创建自己的指针类。所有的数学和布尔运算符都可以创建自己的数字类。