【发布时间】:2016-03-07 12:04:27
【问题描述】:
以前有人问过这个问题,但我觉得提问者在没有真正得到真正答案的情况下匆忙称答案正确。也许没有原因,这需要稍后放入标准中,你告诉我。 What is the rationale to not allow overloading of C++ conversions operator with non-member functions
我正在寻找不允许将其作为当前标准设计的一部分的具体原因。基本上,当您重载强制转换运算符以定义两种类型之间的隐式转换时,此重载定义必须是您要转换的类的成员,而不是类之外的成员。明显的问题是,如果你有一些类型,由于某种原因你真的不能修改,但你想在它们之间进行隐式转换,以简化语法(尽管隐式转换有弊端),或者因为你有一堆其他的依赖于隐式转换的代码、标准或自定义......如果你不能向类添加适当的隐式转换,你就不能这样做,所以你需要使用像常规函数这样的变通方法进行转换,你会围绕什么否则是隐式转换的方便。
另外,在类之外添加这些转换是否真的会产生计算开销?在我看来,编译器很容易在确定哪些函数可用时,将外部隐式转换函数与它们转换的类相关联,以便代码像该类的一部分一样执行就效率而言。唯一的缺点是它必须做的额外工作才能建立初始关联,这应该几乎没有。
我不会将“因为标准这么说”或“因为隐式转换不好”作为答案。有人在编写实际标准时肯定是有原因的。
(我不是专家,我还在学习这门语言。)
编辑,回复: 好吧,我想情况可能是这样的,是的,您更改了头文件,但是您不做的是覆盖现有的头文件,因为那会很糟糕。您将根据旧的头文件创建一个新的头文件以适应更改。假设是旧代码已经在目标文件中编译,并且更改标头只是告诉编译器您在其他地方添加了其他代码。它不会改变旧代码的作用,因为它已经编译并且不依赖于它(即某些供应商将目标代码和标头交给您)。如果我可以修改和重新编译我将使用转换的代码,那么你不能让我在外部编写转换函数,我不会这样做,这太混乱了。您不必随机搜索每个标题以找到正确的定义;如果我自己编写代码,我会制作一个自定义标头,其中包含我添加到供应商提供的标头中的内容的高度可见部分,并且所述标头对于哪个是相对明显的,因为它将与相关类型,而其他标头将以其原始名称命名,因此您会知道它们没有更改。而且您将拥有一个仅包含转换定义的相应文件,因此我的修改将是独立的,与原始目标代码分开,并且相对容易找到。当然,除了在代码中找出应用哪个转换函数的实际斗争之外。我认为您可以找到多种情况,这些情况很容易确定,并且足够自然地使用,因为您可以出于自己的目的添加到这样的现有库中。如果我使用的是我无法真正修改的商业代码,并且我看到可以通过使用转换函数将其与我自己的一些东西集成来改进我正在使用它的情况,我可以看到自己想做这。当然,对于仅阅读 a = b 的第三人来说,这些事情并不明显,他们不会知道我的转换发生了什么,但如果你知道并且它读得很好,那么它就可以工作。
我很欣赏关于标准决策如何运作的见解,这绝对是一种你可以忽略的边缘事物。
【问题讨论】:
标签: c++ c++11 operator-overloading standards