问题标签 [conversion-operator]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 转换运算符不适用于函数参数
为什么这段代码无法编译?
我正在g++ 4.7.3
使用命令进行编译:g++ test.cpp
. 错误信息是:
This answer to an previous question似乎表明这应该可行。
c++ - 由于有两种方法可以在 C++ 中定义转换,当同一转换有两种可能性时,它们如何交互?
我只是在寻找有关 C++ 工作原理的说明,这并不是真正解决我的代码中的特定问题。
在 C++ 中,您可以说类型 A 应该以两种不同的方式隐式转换为类型 B。
如果您是 A 的作者,您可以在 A 中添加如下内容:
如果您是 B 的作者,您可以在 B 中添加如下内容:
如果我理解正确,其中任何一个都将允许 A 隐式转换为 B。那么如果两者都被定义,则使用哪一个?这甚至允许吗?
注意:我了解您可能永远不应该处于这样做的情况。您要么使构造函数显式化,要么更可能只有两者之一。我只是想知道 C++ 规范是怎么说的,我不知道如何查找。
c++ - 带有前向声明的转换运算符
我正在尝试使用 c++ 中的转换运算符我有 2 个类,我正在尝试将它们从一个类转换为另一个类,并且出现错误:
谁能告诉我我做错了什么?
c# - 使用 c#,如何一次重载所有运算符?
我有一个这样的结构。
我Money
是否必须重载所有运算符 +、-、<、<=、>、>=、==、!= 等?或者有没有办法接受所有的运算decimal
符Money
?如您所见Money
,只有一个字段是_quantity
. 我希望所有要求的操作员Money
都应该返回,就好像它被要求提供 _quantity 一样。
也许在隐式转换运算符下面重载会解决这个问题。
我正在创建Money
结构,因为我不想decimal
在我的整个项目中使用。编译器应该强制我使用Money
而不是decimal
. 如果我隐式使用上述转换运算符,它将与创建此结构的原因相矛盾。提前致谢...
c++ - 显式 ref 限定转换运算符模板在起作用
给定以下转换运算符
我希望以下转换都是有效的,但有些会产生编译错误(现场示例):
特别是,1 似乎与 3 相同,并且与 2 几乎相同(对于 7 到 9、8 类似),但行为不同。
任何解释或解决方法?
我的动机是又一个 'any',我最终不得不让所有的转换运算符explicit
来避免像std::is_constructible
,这样的类型特征的问题std::is_convertible
,然后我遇到了新的问题。
编辑对不起,请忽略 3 和 9,我的错误(感谢 Kerrek SB)。然而 7 和 8 仍然是问题。另外,explicit
毕竟似乎无关紧要,再次抱歉。
编辑 2刚刚注意到
如果转换运算符不是 ,则有效explicit
。所以这就是explicit
出现的地方:最初我的示例使用复制初始化,当我切换到时,explicit
我不得不使用直接初始化。然后出现了这个问题(案例 7 和 8)。
c++ - 运算符 float*() 有什么作用?
我一直在查看源代码,试图了解有关 C++ 的更多信息,但遇到了一些看起来令人困惑的代码。我无法通过玩弄它来弄清楚它的用途。
请有人能解释一下操作符 float *() 的作用以及它是如何使用的吗?
我搜索了 StackOverflow,它看起来像是一个转换运算符,但我仍然不确定它的实际作用以及它为什么有用。
亲切的问候,
c++ - 是否可以在没有 typedef 的情况下声明返回数组引用的转换函数?
这是一个返回数组引用的转换函数:
没有 可以做同样的事情typedef
吗?我试过的:
但clang抱怨:
做:
必须使用 typedef 来声明转换为 'int [10]'
意思typedef
是不可缺少?
编辑
如果typedef
有必要,不可能像下面这样创建转换函数模板,因为无法定义typedef
模板,对吗?
c++ - 为什么 c++ I/O 流有一个转换运算符为 void*?
我不小心调用operator delete[]
了一个ifstream
对象,而不是文件名。我希望编译器会发出错误,因为delete[]
只对指针而不是对象进行操作。但是,编译器没有抱怨(甚至没有警告)。
调试时,我看到系统调用operator void*
了对象。令人惊讶的是,这甚至不会崩溃(演示)。
所以我想知道:为什么这个运算符首先存在?
是否需要支持if (!file)
语法?如果是,为什么不将其转换为安全布尔值或explicit operator bool
改用?
c++ - 为什么我不能阻止不受欢迎的 C 风格转换编译?
有一个不受欢迎的 C 风格转换,我无法阻止它编译。不受欢迎的转换执行从某个类的对象到某个其他类的非常量引用的 C 样式转换。类是不相关的。同时,我喜欢支持从同一类的对象到 const 引用的 C 风格转换。我正在提供一个公共转换运算符来支持理想的演员表。在这种情况下,似乎不可能防止不受欢迎的演员阵容。
转换为非常量引用无法构建(“Sandbox::B::operator Sandbox::A &() ”(在第 30 行声明)不可访问*),不幸的是转换为 const 引用要么失败(错误:从 "Sandbox::B" 到 "const Sandbox::A" 的转换函数不止一个:function "Sandbox::B::operator const Sandbox::A &()" function "Sandbox::B::运营商沙盒::A &()" ):
如果我禁用运算符operator A& ()
,则构建所需和不希望的转换。
我正在使用 gcc、icc 和 MSVC 编译。我无法控制客户端代码并阻止使用 C 样式转换。