问题标签 [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.

0 投票
4 回答
1827 浏览

c++ - 指针的 C++ 强制转换运算符

我尝试了以下代码示例,但 A* aa = c; 不编译。为什么不调用转换运算符?没有指针的相同示例有效。所以我不知道为什么C必须从A继承?谢谢你的帮助。

编辑:我知道这样的编码是没有意义的。但我只想了解转换的东西。

0 投票
3 回答
555 浏览

c++ - C++ 重载决议、转换运算符和 const

在这种情况下

情况很清楚 - f(int *) 被调用,这似乎是正确的。

但是,如果我有这个(错误地这样做了(*)):

运算符 char *() 被调用。我无法弄清楚为什么这样的决策路径会比使用运算符 bool() 更好。有任何想法吗?

(*) 如果将 const 添加到第二个运算符,则代码当然可以按预期工作。

0 投票
2 回答
318 浏览

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 之前没有启动TNullable<T>

Ldarga此外,即使在使用而不是Ldarg在执行时,我也无法摆脱反序列化中的错误value = tmp;- 我想我可以尝试隐式转换正在做什么。即value = new Nullable<int>(tmp);,但我想找出我做错了什么。

注意:'emit' 只是我用来生成 IL 的助手。它在ILGenerator内部使用并在每次操作后返回自身,因此我可以将调用链接在一起。

编辑:这是有效的最终代码,带有注释和所有内容。

0 投票
3 回答
598 浏览

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 中的一个错误,在以前的版本中,重载决议确定复制构造函数是最合适的,而无需评估模板参数 - 我试图理解标准中的重载决议注释,但我认为这只是混淆我更多;)

(这可以通过明确构造构造函数或转换运算符来解决,但这不是我们想要的行为)

那里有任何标准专家知道答案吗?

0 投票
1 回答
59 浏览

c++ - 模板化转换运算符的指导声明

考虑如下内容:

我想使用模板化运算符来指定一系列可能的转换,以避免重复代码/复制和粘贴。但是,当然,现在在注释的代码行上进行的一系列转换将不起作用,因为在 C++ 中,编译器合理地不会考虑所有形式的模板化运算符,因为那将是难以处理的。

如果我改为选择剪切和粘贴,并按如下方式定义 Bar:

现在可以确定并找到链式转换。我想要的是能够吃到我的蛋糕并吃掉它,特别是将运算符定义为模板,而且还提供了一系列指导声明,可以像将转换运算符定义为非模板一样使用:

有没有办法在 C++11/C++14 中实现这一点?是否有人对构建代码有建议,允许不复制转换运算符的定义,但仍然可以使用转换运算符的有限实例化,就好像它们是单独定义的一样?

0 投票
1 回答
102 浏览

c++ - 为什么值返回的未命名对象在调用其转换运算符之前被破坏?

我有一个按值返回对象的函数。接收者变量需要调用该对象上的外向转换运算符。如果我在返回语句 (RVO) 中构造返回的对象,则在外向转换运算符之前调用其析构函数。但是,如果我命名对象并返回它,则在对象被破坏之前调用外向转换运算符。这是为什么?

输出是:

当 bar() 被调用时,引用在调用转换运算符之前被删除,并且它崩溃。另外,我不明白为什么在构建返回值时会调用 Ref 到 int* 的转换。

0 投票
2 回答
162 浏览

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 编译器按预期给了我一个错误。(在这里查看现场演示)

0 投票
3 回答
285 浏览

c++ - 类模板中的转换运算符

我有两个类模板TemplateA<T>TemplateB<T>. 现在,我想定义一个转换运算符,TemplateB<T>以允许从TemplateB<T>to进行隐式类型转换TemplateA<T>。但是,以下代码会产生编译错误:

错误:

0 投票
1 回答
376 浏览

c++ - 我对转换运算符的继承感到困惑

考虑以下程序:(在此处查看现场演示。

程序的输出是:

9

9

Base这里继承了类的转换运算符,所以m变量的初始化是有效的。

但现在我想打印s属于 Derived 的数据成员的值。我怎样才能做到这一点?

是否也需要为派生类重写转换运算符?我不能重用相同的Base类转换运算符吗?

0 投票
1 回答
609 浏览

c++ - 运算符 T() 未在赋值中使用

我对此有点困惑。假设我有一个助手类Data

然后当我这样做时:

它有效,但当我继续这样做时:

它没有抱怨:

但即使提供

没有帮助。关于转换的消息消失了,错误保持不变。除了添加之外有没有办法解决这个问题

QString或显式调用

?

我很困惑,因为编译器清楚地正确推断出左操作数是 aQString并且它显然试图将转换从sData之一调用,但即使定义了这样的转换它仍然不起作用。QStringoperator=

编辑: 问题似乎来自不同operator T()成员的多个定义。在这种情况下operator int()