问题标签 [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 投票
0 回答
79 浏览

c++ - 使用转换运算符时模板推导失败,但显式转换有效

我正在尝试使用模板编程在 C++ 中实现 swizzle 向量。对于 swizzle 向量,我的意思是类似于 hlsl 和 glsl 向量的向量,例如,如果你有一个向量v = (1,2,3,4)并且v.xxyz它会产生向量 (1,1,2,3)。

这涉及一个类似于下面给出的示例的数据结构,但是我删除了一堆东西以生成一个最小的工作示例。

在上面的示例中,使用类型参数对 Foo 的调用swizzle不会编译,除非我将其显式转换swizzle为 avec2<float>即使swizzle具有转换运算符。处理模板时隐式转换不起作用吗?我的问题是我希望能够Foo同时Foo(v)使用Foo(v.xy).

0 投票
6 回答
2657 浏览

c++ - 为什么 switch 和 if 语句与转换运算符的行为不同?

为什么switchif语句与转换运算符的行为不同?

编译错误switch quantity is not an integerif语句中被完全识别为bool. (海合会)

0 投票
1 回答
274 浏览

c++ - 隐式转换运算符与模板构造函数 - 应该优先考虑谁?

考虑以下代码片段:

编译时-std=c++17

  • clang++(trunk) 成功编译代码;

  • g++(trunk) 无法编译代码 - 它实例化foo(const T&).

使用 编译时-std=c++11,两个编译器都拒绝该代码。C++17 中新的纯右值具体化规则可能会影响此处的行为。

godbolt.org 上的实时示例


这里的正确行为是什么?

  • 标准是否保证foo::foo(const T&)将(或不)实例化?

  • 标准是否保证隐式转换运算符将优先于 的调用foo::foo(const T&),无论它是否被实例化?

0 投票
1 回答
298 浏览

c++ - 使用模板转换运算符的模糊解决方案

我不得不做一个类似的代码:

它可以在 GCC 和 Clang 下工作,但不能在 Visual Studio 上编译,并且会出现不明确的分辨率错误。哪个编译器错了,为什么?

GCC 和 Clang , Visual Studio

这是 msvc 输出:

0 投票
2 回答
105 浏览

c++ - 转换运算符与已删除的构造函数

请看以下代码:

在这里,Y带有 an 的构造函数X被显式删除,而X有一个转换运算符 into Y。在这两个直接矛盾的地方,似乎=delete总是赢;我在一些最新版本的 GCC、Clang 和 VC++ 上进行了测试。

问题:这是“正确”的行为吗?我认为转换构造函数和转换运算符之间没有特别的优先级,所以上面的代码应该会产生重载解析歧义错误。但事实并非如此。它抱怨使用已删除功能。是因为保证复制省略吗?

我用谷歌搜索并找到Conversion constructor vs. conversion operator: priority。在那个问题中,选择了转换运算符,因为它是一个更好的匹配,因为存在const于转换构造函数中。但是,就我而言,更换Y(X&)Y(X const&)没有任何改变。


实际上,我想要的情况如下:

是的,有人可能会说这很傻,但确实有一些内置类型的行为就是这样:替代X <- int&Y <- int&&。无法创建完全模仿内置引用类型的用户定义类型似乎是当前 C++ 中一个非常缺失的部分......

0 投票
1 回答
397 浏览

c++ - 多个隐式转换运算符

考虑以下 C++ 代码:

GCC 编译成功。Clang 给出一个错误:

错误:条件表达式不明确;'X' 和 'Y' 可以转换为几种常见的类型

MSVC 也报错:

错误 C2446: ':': 没有从 'Y' 到 'X' 的转换

注意:没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符

哪个编译器在这里是正确的,在这种情况下,C++ 标准的相关部分是什么?我的猜测是 [over.match.oper] 是适用的,但到目前为止我无法从中找出预期的行为。

更新:如果我们将两者都更改operator int()为转换为其他类型,例如operator bool(),那么 GCC 也会出错。也许有一些关于int类型的特殊规则?

0 投票
2 回答
228 浏览

c++ - clang 6 和 clang 7 的模板转换运算符区别

我有一些代码使用模板转换运算符来查找通过 ADL 找到的函数的返回类型。

简化的代码如下所示:

在 clang 6 和 GCC 中,上面的代码可以编译。但是,在 Clang 7 中,它不再编译了!

https://godbolt.org/z/Lfs3UH

如您所见,clang 6 解决了对的调用,probe<foo::bar>::operator foo::bar&&<foo::bar, foo::bar&&, 0>()但 clang 7 失败,因为它尝试调用probe<foo::bar>::operator const foo::bar&&<const foo::bar, foo::bar&&, 0>()

哪个编译器是对的?标准中的规则是什么?这是一个新的 Clang 错误还是修复?


我想检查很多情况。不仅foo::bar作为参数,还有许多引用类型,例如:

解决正确的函数调用很重要。

这是所有这些情况的一个活生生的例子,GCC 成功但 clang 失败:https ://godbolt.org/z/yrDFMg

0 投票
1 回答
41 浏览

c++11 - 如何使用 SFINAE 启用转换运算符的显式隐性?

考虑以下代码:

理想情况下,此代码将使转换运算符隐式 whenFrom可隐式转换为To,并使转换运算符显式 whenTo可显式构造 from From

但是,代码当前无法编译,因为从编译器的角度来看,两个转换运算符具有相同的签名。

问题:是否有任何方法可以欺骗编译器以产生预期的行为?


答案:基于Quentin答案的完整代码:

0 投票
1 回答
393 浏览

c++ - c ++使用带有枚举类和重载转换运算符的模板函数

我正在阅读另一篇文章Specializations only for C++ template function with enum non-type template parameter上的示例代码

我试图更进一步,通过使用重载的转换运算符来使用对象,就好像它是调用模板函数的枚举成员一样。

最后一行不起作用,我试图将转换后的对象放入模板中并调用特定于 A 类型的能力。我尝试了一些不同的东西,但似乎找不到我要找的东西,有没有合适的方法来做到这一点?

0 投票
0 回答
159 浏览

c++ - 下标运算符和隐式转换为指针类型

我正在阅读 C++ Templates - The Complete Guide, 2nd Edition, and B.2.1 讲述了隐含的“this”参数的隐式转换。

同样的例子: http ://www.open-std.org/jtc1/sc22/wg21/docs/papers/2004/n1592.pdf

根据 ptrdiff_t 的 typedef,编译器可能会推断出 BadString::operator[] 与将隐含的“this”参数转换为 char * 并使用内置的下标运算符之间存在歧义。

有人可以解释一下 obj[0] 表达式与这种转换有何关系,以及为什么编译器会按照下面三个示例中的方式进行操作?

谢谢你。

工作(为什么?):

不起作用(为什么):

不起作用(重载运算符 '[]' 的使用不明确):