问题标签 [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++ - 指针的 C++ 强制转换运算符
我尝试了以下代码示例,但 A* aa = c; 不编译。为什么不调用转换运算符?没有指针的相同示例有效。所以我不知道为什么C必须从A继承?谢谢你的帮助。
编辑:我知道这样的编码是没有意义的。但我只想了解转换的东西。
c++ - C++ 重载决议、转换运算符和 const
在这种情况下
情况很清楚 - f(int *) 被调用,这似乎是正确的。
但是,如果我有这个(错误地这样做了(*)):
运算符 char *() 被调用。我无法弄清楚为什么这样的决策路径会比使用运算符 bool() 更好。有任何想法吗?
(*) 如果将 const 添加到第二个运算符,则代码当然可以按预期工作。
c# - 为 Nullable 生成 IL序列化?
我正在编写自己的序列化程序,它发出 IL 来生成 [反] 序列化代码。
对于 nullables,我想我可以生成以下内容(int?
作为 ex)(假设我们已经生成了 [de]serialize 的方法int
):
这是我生成它的方式:
我还生成了一个用于调试的程序集。我在 ILSpy 中加载它,C# 代码看起来与我的想法完全一样。但是 peverify 有话要说……
我想了一会儿,然后意识到这Nullable<T>
是一个结构,所以我应该使用Ldarga
而不是Ldarg
所以我将我ldarg_1()
的改为ldarga(1)
现在 peverify 给出:
我认为这与Nullable<T>
转换运算符有关,所以我尝试了该Value
属性:
peverify 对此感到高兴!
问题是,为什么在将 nullable 转换为其底层类型时,显式运算符 from 之前没有启动T
?Nullable<T>
Ldarga
此外,即使在使用而不是Ldarg
在执行时,我也无法摆脱反序列化中的错误value = tmp;
- 我想我可以尝试隐式转换正在做什么。即value = new Nullable<int>(tmp);
,但我想找出我做错了什么。
注意:'emit' 只是我用来生成 IL 的助手。它在ILGenerator
内部使用并在每次操作后返回自身,因此我可以将调用链接在一起。
编辑:这是有效的最终代码,带有注释和所有内容。
c++11 - Clang 3.5 和 3.6 之间重载分辨率的这种变化是正确的还是错误的?
下面的代码在 Visual Studio 2013、gcc 4.8、clang 3.4 和 clang 3.5(Apple LLVM 6.0)中编译,但不能在 clang 3.6 中编译(通过 Apple LLVM 6.1)
该代码是我们代码库中一个复杂类的简化版本,这是展示问题的最低要求。
问题的症结在于TYPED_VALUE
,在 3.6 中,STRING
由于存在接受STRING
; 这会导致std::is_constructible
被评估,这导致它需要定义STRING
(我们无法在此处提供 - 会导致完整代码中的循环依赖)。
错误信息是
对我来说,这似乎是 3.6 中的一个错误,在以前的版本中,重载决议确定复制构造函数是最合适的,而无需评估模板参数 - 我试图理解标准中的重载决议注释,但我认为这只是混淆我更多;)
(这可以通过明确构造构造函数或转换运算符来解决,但这不是我们想要的行为)
那里有任何标准专家知道答案吗?
c++ - 模板化转换运算符的指导声明
考虑如下内容:
我想使用模板化运算符来指定一系列可能的转换,以避免重复代码/复制和粘贴。但是,当然,现在在注释的代码行上进行的一系列转换将不起作用,因为在 C++ 中,编译器合理地不会考虑所有形式的模板化运算符,因为那将是难以处理的。
如果我改为选择剪切和粘贴,并按如下方式定义 Bar:
现在可以确定并找到链式转换。我想要的是能够吃到我的蛋糕并吃掉它,特别是将运算符定义为模板,而且还提供了一系列指导声明,可以像将转换运算符定义为非模板一样使用:
有没有办法在 C++11/C++14 中实现这一点?是否有人对构建代码有建议,允许不复制转换运算符的定义,但仍然可以使用转换运算符的有限实例化,就好像它们是单独定义的一样?
c++ - 为什么值返回的未命名对象在调用其转换运算符之前被破坏?
我有一个按值返回对象的函数。接收者变量需要调用该对象上的外向转换运算符。如果我在返回语句 (RVO) 中构造返回的对象,则在外向转换运算符之前调用其析构函数。但是,如果我命名对象并返回它,则在对象被破坏之前调用外向转换运算符。这是为什么?
输出是:
当 bar() 被调用时,引用在调用转换运算符之前被删除,并且它崩溃。另外,我不明白为什么在构建返回值时会调用 Ref 到 int* 的转换。
c++ - 运算符 void*() 转换仍然是 C++ 库的一部分吗?
考虑这个程序:
AFAIK 转换函数运算符 void* () const已从 C++11 中删除。因此,该程序在 C++11 编译器上编译时应该会失败。是的,确实 g++ 4.8.1 和 4.9.2 都给出了诊断(以警告的形式删除 void* 是未定义的,这也是一件好事)。但是这个程序不应该因为删除该转换函数而导致编译失败,因为在 C++98 和 C++03 中所有流对象都可以隐式转换为 void* 吗?这是错误吗?他们仍未实施此更改似乎有点令人惊讶。
我已经在 g++ 4.9.2(支持 C++14)中尝试过这个程序,但它给出的是警告而不是编译器错误。Ideone 编译器按预期给了我一个错误。(在这里查看现场演示)
c++ - 类模板中的转换运算符
我有两个类模板TemplateA<T>
和TemplateB<T>
. 现在,我想定义一个转换运算符,TemplateB<T>
以允许从TemplateB<T>
to进行隐式类型转换TemplateA<T>
。但是,以下代码会产生编译错误:
错误:
c++ - 我对转换运算符的继承感到困惑
考虑以下程序:(在此处查看现场演示。)
程序的输出是:
9
9
Base
这里继承了类的转换运算符,所以m
变量的初始化是有效的。
但现在我想打印s
属于 Derived 的数据成员的值。我怎样才能做到这一点?
是否也需要为派生类重写转换运算符?我不能重用相同的Base
类转换运算符吗?
c++ - 运算符 T() 未在赋值中使用
我对此有点困惑。假设我有一个助手类Data
然后当我这样做时:
它有效,但当我继续这样做时:
它没有抱怨:
但即使提供
没有帮助。关于转换的消息消失了,错误保持不变。除了添加之外有没有办法解决这个问题
到QString
或显式调用
?
我很困惑,因为编译器清楚地正确推断出左操作数是 aQString
并且它显然试图将转换从sData
之一调用,但即使定义了这样的转换它仍然不起作用。QString
operator=
编辑:
问题似乎来自不同operator T()
成员的多个定义。在这种情况下operator int()
。