问题标签 [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++ 中实现 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)
.
c++ - 为什么 switch 和 if 语句与转换运算符的行为不同?
为什么switch
和if
语句与转换运算符的行为不同?
编译错误switch quantity is not an integer
在if
语句中被完全识别为bool
. (海合会)
c++ - 隐式转换运算符与模板构造函数 - 应该优先考虑谁?
考虑以下代码片段:
编译时-std=c++17
:
clang++
(trunk) 成功编译代码;g++
(trunk) 无法编译代码 - 它实例化foo(const T&)
.
使用 编译时-std=c++11
,两个编译器都拒绝该代码。C++17 中新的纯右值具体化规则可能会影响此处的行为。
这里的正确行为是什么?
标准是否保证
foo::foo(const T&)
将(或不)实例化?标准是否保证隐式转换运算符将优先于 的调用
foo::foo(const T&)
,无论它是否被实例化?
c++ - 使用模板转换运算符的模糊解决方案
我不得不做一个类似的代码:
它可以在 GCC 和 Clang 下工作,但不能在 Visual Studio 上编译,并且会出现不明确的分辨率错误。哪个编译器错了,为什么?
这是 msvc 输出:
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++ 中一个非常缺失的部分......
c++ - 多个隐式转换运算符
考虑以下 C++ 代码:
GCC 编译成功。Clang 给出一个错误:
错误:条件表达式不明确;'X' 和 'Y' 可以转换为几种常见的类型
MSVC 也报错:
错误 C2446: ':': 没有从 'Y' 到 'X' 的转换
注意:没有可以执行此转换的用户定义转换运算符,或者无法调用该运算符
哪个编译器在这里是正确的,在这种情况下,C++ 标准的相关部分是什么?我的猜测是 [over.match.oper] 是适用的,但到目前为止我无法从中找出预期的行为。
更新:如果我们将两者都更改operator int()
为转换为其他类型,例如operator bool()
,那么 GCC 也会出错。也许有一些关于int
类型的特殊规则?
c++ - clang 6 和 clang 7 的模板转换运算符区别
我有一些代码使用模板转换运算符来查找通过 ADL 找到的函数的返回类型。
简化的代码如下所示:
在 clang 6 和 GCC 中,上面的代码可以编译。但是,在 Clang 7 中,它不再编译了!
如您所见,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
c++11 - 如何使用 SFINAE 启用转换运算符的显式隐性?
考虑以下代码:
理想情况下,此代码将使转换运算符隐式 whenFrom
可隐式转换为To
,并使转换运算符显式 whenTo
可显式构造 from From
。
但是,代码当前无法编译,因为从编译器的角度来看,两个转换运算符具有相同的签名。
问题:是否有任何方法可以欺骗编译器以产生预期的行为?
答案:基于Quentin答案的完整代码:
c++ - c ++使用带有枚举类和重载转换运算符的模板函数
我正在阅读另一篇文章Specializations only for C++ template function with enum non-type template parameter上的示例代码
我试图更进一步,通过使用重载的转换运算符来使用对象,就好像它是调用模板函数的枚举成员一样。
最后一行不起作用,我试图将转换后的对象放入模板中并调用特定于 A 类型的能力。我尝试了一些不同的东西,但似乎找不到我要找的东西,有没有合适的方法来做到这一点?
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] 表达式与这种转换有何关系,以及为什么编译器会按照下面三个示例中的方式进行操作?
谢谢你。
工作(为什么?):
不起作用(为什么):
不起作用(重载运算符 '[]' 的使用不明确):