- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
之前曾有人问过这个问题,但是当他从未真正得到真正的答案时,我觉得提问者急于将答案正确。也许没有理由,您需要告诉我,稍后需要将其放入标准中。
What is the rationale to not allow overloading of C++ conversions operator with non-member functions
我正在寻找不允许将其作为当前标准设计一部分的具体原因。基本上,当重载类型转换运算符以定义两种类型之间的隐式转换时,此重载定义必须是要从其转换的类的成员,而不是类外部的成员。显而易见的问题是,如果您出于某种原因确实无法修改类型,但是为了简化语法(尽管隐式转换有弊端),则希望在它们之间进行隐式转换(或者隐式转换的弊端),或者因为您有很多其他类型依赖于隐式转换的代码,标准或自定义...如果无法向类中添加适当的隐式转换,则无法执行此操作,因此您需要使用常规功能(如常规函数)进行变通,以解决可能的问题否则是隐式转换的便利。
另外,是否真的可能存在将这些转换添加到类之外的计算开销?我的看法是,编译器很容易在确定可用的函数时将外部隐式转换函数与它们所转换的类相关联,以便像该类的一部分一样执行代码就效率而言。唯一的缺点是建立初始关联必须要做的额外工作,但这几乎没有。
我不会以“因为标准这样说”或“因为隐式转换不好”作为答案。当他们编写实际标准时,肯定会有一个原因。
(我不是专家,我还在学习语言。)
编辑,回复:
好吧,我想情况可能是这样的,是的,您更改了头文件,但是您不做的是覆盖现有的文件,因为那会很糟糕。您将基于旧的头文件创建一个新的头文件以适应更改。假定旧代码已经在目标文件中进行了编译,而更改 header 只是告诉编译器您在其他地方添加了其他代码。它不会更改旧代码的功能,因为它已经编译并且不依赖于此(即,某些供应商将您的目标代码和 header 交给了您)。如果我可以修改和重新编译将用于转换的代码,那么您就无法让我在外部编写转换函数,我不会这样做,这太令人困惑了。您不必在每个标题中随机搜索正确的定义;如果我自己编写代码,则将创建一个自定义 header ,该 header 具有一个高度可见的部分,其中添加到供应商提供的 header 中的内容是该 header ,并且该 header 相对于哪个 header 将是相对显而易见的,因为它将与相关的类型,其他 header 将使用其原始名称来命名,因此您将知道它们没有更改。并且您将有一个仅包含转换定义的相应文件,因此我的修改将是自包含的,与原始目标代码分离,并且相对容易找到。当然,这与在代码中找出适用转换函数的实际工作有所不同。我认为您会发现各种情况,这些情况很容易确定,并且足够自然地使用,可以出于您自己的目的添加到这样的现有库中。如果我使用的是我无法真正修改的商业代码,并且看到一种情况,可以通过使用转换功能将其与我自己的某些东西集成来改善我正在做的事情,那么我可能会发现自己想要这样做这。当然,对于仅阅读a = b的第三方来说,这样的事情并不明显,他们不知道我的转换是怎么回事,但是如果您知道并且它读起来很好,那么它就可以工作。
我很欣赏关于标准决策如何起作用的见解,这绝对是您可以忽略的一种附带事物。
最佳答案
operator bool()
时,您还可以让非显式构造函数在要转换到的类中使用单个参数,以此作为引入用户定义的转换的方式。 (未提及)A
和B
这两种类型之间引入用户定义的转换的原因……这会造成困惑。A
和B
的“旧”代码可以完全更改其含义。取决于您的 header 是否包含在 header 之前,或者类似的操作。a = b;
的作用,他们只需要阅读a
类型和b
类型的定义,然后从那里去...如果您这样做,可能会很丑陋且痛苦开始允许更难了解的这些“陷阱”转换。operator <<
用于流而言,你可能会说同样的话...但是对于用户定义的转换来说,它会更加严重,因为它可能会影响该类型的对象作为参数传递的任何代码行。
- Legacy: the feature was left out in the first place and now we've built a lot without it that it's almost forgotten (see partial function template specialization).
关于c++ - 为什么我不能将C++转换运算符作为非成员函数重载于类之外?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34056443/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!